名前 題名 ▼ Mr.XRAYさん > >一方,SimpleRoundTo 関数は,元の値を使用して四捨五入します. > >そのために違いが生じることになります. > > SimpleRoundTo 関数で使用する元の値を確認してみます. > 元の値とは計算式による値のことです. > Delphi XE2 で実装された浮動小数点用レコードで計算結果の値をバイト値 > で確認してみました. > 図のように,e の値が 1 だけ小さい値になっています. > つまり,FloatToStr(SimpleRoundTo) の結果は,計算結果を正確に反映していると言えます. > > [Delphi のデータ型 - RAD Studio] > http://docwiki.embarcadero.com/RADStudio/XE6/ja/Delphi_%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B#.E6.B5.AE.E5.8B.95.E5.B0.8F.E6.95.B0.E7.82.B9.E3.83.87.E3.83.BC.E3.82.BF.E5.9E.8B > > で,Extended 型のレコード型は TExtended80Rec なので,これを使用しています. > 動作確認は,Windows 7 U6(SP1) + Delphi XE5 Pro (VCL-32) です. > > > //----------------------------------------------------------------------------- > // (1)と(2)の計算式は,数学的には等しく,179.935となる > // SimpleRoundToの使用にはusesにMathが必要 > // Delphi XE2 で実装された浮動小数点用レコードで計算結果の値を確認 > //----------------------------------------------------------------------------- > procedure TForm1.Button1Click(Sender: TObject); > var > a,b,c,d,e,f:Extended; > FF: TExtended80Rec; > I: Integer; > 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) > > FF := TExtended80Rec(e); > StrText := ''; > for I := 9 downto 0 do begin > StrText := StrText + IntToHex(FF.Bytes[I], 2) + ' '; > end; > > FF := TExtended80Rec(f); > StrText := StrText + sLineBreak + ''; > for I := 9 downto 0 do begin > StrText := StrText + IntToHex(FF.Bytes[I], 2) + ' '; > end; > > StrText := StrText + sLineBreak + sLineBreak + > FloatToStr(e)+#13+ > FloatToStr(f)+#13+ sLineBreak + > FloatToStr(SimpleRoundTo(e,-2))+#13+ > FloatToStr(SimpleRoundTo(f,-2)); > > MessageBox(Handle, PChar(StrText), '結果', MB_OK); > end; > GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link