如何解决Delphi 5 - 四舍五入到小数点后四位异常
简单的数学,我想。我得到了 99.99% 的正确答案,但这个是在实际环境中发现的。
我需要将一个浮点值四舍五入到 4 位,在第 4 位之后删除任何东西,所以这个例子不应该是一个问题。
0.6720/0.672 是正确答案,为什么示例 trunc & int 返回 .6719?
((12.0000 * 5.6000) / 100) = 0.672
Trunc(((12.0000 * 5.6000) / 100) * 10000) / 10000) = .6719
Int(((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;
Screen shot of calculation results
解决方法
我曾经遇到过类似的问题...
x:=Trunc(12 * 100 * 5.6) ; // 6720
x:=Trunc(12 * 5.6 * 100) ; // 6719
x:=12*5.6*100;
x:=trunc(x); // 6720
可以使用RoundTo
x:=RoundTo(12*5.6*100,0); // 6720
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。