首页 > 解决方案 > Delphi 5 - 舍入到小数点后 4 位异常

问题描述

简单的数学,我想。我得到了 99.99% 值的正确答案,但这个值是在现场环境中发现的。

我需要将浮点值四舍五入到 4 位,在第 4 位之后删除任何内容,所以这个例子应该不是问题。

0.6720/0.672 是正确答案,为什么示例 trunc & int 返回 .6719?

((12.0000 * 5.6000) / 100) = 0.672

截断(((12.0000 * 5.6000) / 100) * 10000) / 10000) = .6719

整数(((12.0000 * 5.6000) / 100) * 10000) / 10000) = .6719

我在表单中添加了一个列表视图和按钮以获取以下示例

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y : Double;
  Itm: TListItem;
begin
  x := 12.0000;
  y :=  5.6000;

  Itm := ListView1.Items.Add;
  Itm.Caption := 'a. FloatToStr((12.0000 * 5.6000) / 100) ';
  Itm.SubItems.Add(FloatToStr((x * y) / 100));

  Itm := ListView1.Items.Add;
  Itm.Caption := 'b. ((12.0000 * 5.6000) / 100) * 10000 ';
  Itm.SubItems.Add(FloatToStr(((x * y) / 100) * 10000));

  Itm := ListView1.Items.Add;
  Itm.Caption := 'c. ((12.0000 * 5.6000) / 100) * 10000 ';
  Itm.SubItems.Add(FloatToStr(((x * y) / 100) * 10000));

  Itm := ListView1.Items.Add;
  Itm.Caption := 'd. Trunc(((12.0000 * 5.6000) / 100) * 10000) / 10000) ';
  Itm.SubItems.Add(FloatToStr(  Trunc(((x * y) / 100) * 10000) / 10000) );

  Itm := ListView1.Items.Add;
  Itm.Caption := 'e. Int(((12.0000 * 5.6000) / 100) * 10000) / 10000) ';
  Itm.SubItems.Add(FloatToStr(  Int(((x * y) / 100) * 10000) / 10000) );
end;

计算结果截图

标签: delphi-5

解决方案


I once had a similar problem...

   x:=Trunc(12 * 100 * 5.6) ;      // 6720

   x:=Trunc(12 * 5.6 * 100) ;        // 6719

   x:=12*5.6*100;
   x:=trunc(x);       // 6720

Could be used RoundTo

   x:=RoundTo(12*5.6*100,0);    // 6720

推荐阅读