[Delphi] 数字の丸め
トップページへ
※全てのDelphi(楽天市場で探す ・ amazonで探す)で動作する保証はありません。また、内容に関し管理人は全ての責任を負いかねます
サンプル ※説明に必要な部分しか記述していません
このサンプルではRoundToとSimpleRoundToを使って複数のパターンを試していますが、それぞれで結果に違いがあります
下記を実行すると
procedure TForm1.Button1Click(Sender: TObject); //フォーム上にTMemoを配置します //uses句に Math を追加しておきます //RoundToとSimpleRoundToとで結果に違いがあります。各関数の詳細はヘルプを参照して下さい var w_e: Extended; begin Memo1.Clear; Memo1.Lines.Add('Round : 近い整数への丸め'); w_e := System.Round(1.4); Memo1.Lines.Add(FloatToStr(w_e)); w_e := System.Round(1.5); Memo1.Lines.Add(FloatToStr(w_e)); Memo1.Lines.Add('RoundTo : 丸め("Banker''s Rounding"法)'); w_e := Math.RoundTo(1.4, 0); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.RoundTo(1.5, 0); Memo1.Lines.Add(FloatToStr(w_e)); //小数点第2位以下を丸め w_e := Math.RoundTo(1.45, -1); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.RoundTo(1.55, -1); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.RoundTo(1.454, -2); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.RoundTo(1.456, -2); Memo1.Lines.Add(FloatToStr(w_e)); //十の位以下を丸め w_e := Math.RoundTo(1234, 2); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.RoundTo(1256, 2); Memo1.Lines.Add(FloatToStr(w_e)); Memo1.Lines.Add('SimpleRoundTo : 丸め(非対称的な算術型丸め)'); w_e := Math.SimpleRoundTo(1.4, 0); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.SimpleRoundTo(1.5, 0); Memo1.Lines.Add(FloatToStr(w_e)); //小数点第2位以下を丸め w_e := Math.SimpleRoundTo(1.45, -1); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.SimpleRoundTo(1.55, -1); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.SimpleRoundTo(1.454, -2); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.SimpleRoundTo(1.456, -2); Memo1.Lines.Add(FloatToStr(w_e)); //十の位以下を丸め w_e := Math.SimpleRoundTo(1234, 2); Memo1.Lines.Add(FloatToStr(w_e)); w_e := Math.SimpleRoundTo(1256, 2); Memo1.Lines.Add(FloatToStr(w_e)); end;
画像の通り「1.45および1.55の小数点第2位以下を丸めた時」、RoundTo(結果:1.4 と 1.6)とSimpleRoundTo(結果:1.5 と 1.5) では値が異なります。
一方で、通常の第二位の四捨五入だと
1.45→1.5
1.55→1.6
と思われ、このことから「丸め」処理は四捨五入とは完全に一致しないと思われます。