四捨五入と丸めに関するサンプルです.
例えば以下のコードを実行します.
コードの下の図を見てください.
動作確認は,Windows 7 U64(SP1) + Delphi XE5 Pro で,32 ビットのEXEです.
//-----------------------------------------------------------------------------
// (1)と(2)の計算式は,数学的には等しく,179.935となる
// SimpleRoundToの使用にはusesにMathが必要
//
// Math.GetRoundModeで取得したモードはrmNearest
// Extendedの扱いは
// Math.SetPrecisionMode(pmDouble);
// でDouble型として扱うようにできる
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,e,f:Extended;
strText : String;
begin
a:=389.7;
b:=94.4;
c:=30;
d:=0.35;
e:=(a+b+c)*d; //(1)
f:=a*d+b*d+c*d; //(2)
StrText := FloatToStr(e)+#13+
FloatToStr(f)+#13+ sLineBreak +
FloatToStr(SimpleRoundTo(e,-2))+#13+
FloatToStr(SimpleRoundTo(f,-2));
MessageBox(Handle, PChar(strText), '結果', MB_OK);
end;
//-----------------------------------------------------------------------------
// 変数の型をDoubleとした場合
//-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
a,b,c,d,e,f:Double;
strText : String;
begin
a:=389.7;
b:=94.4;
c:=30;
d:=0.35;
e:=(a+b+c)*d; //(1)
f:=a*d+b*d+c*d; //(2)
StrText := FloatToStr(e)+#13+
FloatToStr(f)+#13+ sLineBreak +
FloatToStr(SimpleRoundTo(e,-2))+#13+
FloatToStr(SimpleRoundTo(f,-2));
MessageBox(Handle, PChar(strText), '結果', MB_OK);
end;
数学的に正確な値は,どちらも 179.94 です.
e:=(a+b+c)*d; //(1)
f:=a*d+b*d+c*d; //(2)
しかし,結果の図のように Extended 型では e と f が違っています.
Double 型では同じ値になっていますが,数学的に正しい値ではありません.
|