[Delphi]丸め

 

※全てのDelphiで動作する保証はありません。また、内容に関し管理人は全ての責任を負いかねます

サンプル ※説明に必要な部分しか記述していません

このサンプルではRoundToとSimpleRoundToを使って複数のパターンを試していますが、それぞれで結果に違いがあります

 

Delphi関連書籍 amazon

 


下記を実行すると

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

と思われ、このことから「丸め」処理は四捨五入とは完全に一致しないと思われます。

delphi-roundto-simpleroundto