名前 題名 ▼ Mr.XRAYさん > 四捨五入と丸めに関するサンプルです. > 例えば以下のコードを実行します. > コードの下の図を見てください. > 動作確認は,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 型では同じ値になっていますが,数学的に正しい値ではありません. GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link