[Delphi] 数字の丸め






トップページへ

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

※(2025/2/11) 小数第3位の実行例を追加しました。

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

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

 

 


下記を実行すると

procedure TForm1.Button1Click(Sender: TObject);

//フォーム上にTMemo, TButtonを配置します

//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));

    //小数点第3位を処理
    w_e := Math.RoundTo(2.124, -2);
    Memo1.Lines.Add(FloatToStr(w_e));
    w_e := Math.RoundTo(2.125, -2);
    Memo1.Lines.Add(FloatToStr(w_e));
    Memo1.Lines.Add('RoundToだと、小数第3位が4、5どちらの場合でも切り捨てられました');



    //十の位以下を丸め
    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));

    //小数点第3位を処理
    w_e := Math.SimpleRoundTo(2.124, -2);
    Memo1.Lines.Add(FloatToStr(w_e));
    w_e := Math.SimpleRoundTo(2.125, -2);
    Memo1.Lines.Add(FloatToStr(w_e));
    Memo1.Lines.Add('SimpleRoundToだと、小数第3位が4なら切り捨て、5なら切り上げられました');

    //十の位以下を丸め
    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;

Delphiで「丸め」「四捨五入」「切り上げ」「切り捨て」処理として、RoundToやSimpleRoundToを試した結果の違い

画像の通り「1.45および1.55の小数点第2位以下を丸めた時」、

RoundTo(結果:1.4 と 1.6)と

SimpleRoundTo(結果:1.5 と 1.5)

とでは値が異なります。

 

一方で、算数としての第二位の四捨五入だと

1.45→1.5

1.55→1.6

と思われ、このことから「丸め」処理は四捨五入とは完全に一致しない場合があるので注意が必要です。

Delphi公式

System.Math.RoundTo

System.Math.SimpleRoundTo

 

 

関連記事

[Delphi]小数の切り上げ、切り捨て

 

Delphiメニューへ戻る

 






関連記事
[Delphi]小数の切り上げ、切り捨て

[Delphi]実行ファイルのパス付ファイル名 Application.ExeName

[Delphi]外部EXEの実行 ShellExecute

[Delphi]関係演算子

[Delphi]算術演算子