gpt4 book ai didi

delphi - 在Delphi中比较货币值时如何避免舍入问题?

转载 作者:行者123 更新时间:2023-12-03 15:15:06 25 4
gpt4 key购买 nike

据我所知,Delphi Win32 中的货币类型取决于处理器浮点精度。因此,我在比较两个货币值时遇到舍入问题,根据机器返回不同的结果。

现在我使用 SameValue 函数传递 Epsilon 参数 = 0.009,因为我只需要 2 位小数精度。

有没有更好的方法来避免这个问题?

最佳答案

Delphi 中的货币类型是按 1/10,000 缩放的 64 位整数;换句话说,其最小增量相当于0.0001。它不像浮点代码那样容易受到精度问题的影响。

但是,如果您将货币数字乘以浮点类型,或除以货币值,则确实需要以一种或另一种方式计算舍入。 FPU 控制此机制(称为“控制字”)。数学单元包含一些控制此机制的过程:特别是 SetRoundMode。你可以在这个程序中看到效果:

{$APPTYPE CONSOLE}

uses Math;

var
x: Currency;
y: Currency;
begin
SetRoundMode(rmTruncate);
x := 1;
x := x / 6;
SetRoundMode(rmNearest);
y := 1;
y := y / 6;
Writeln(x = y); // false
Writeln(x - y); // 0.0001; i.e. 0.1666 vs 0.1667
end.

您使用的第三方库可能将控制字设置为不同的值。您可能希望在重要计算的起点明确设置控制字(即舍入模式)。

此外,如果您的计算曾经转换为普通 float ,然后又转换回货币,那么所有的赌注都会失败 - 太难审计了。确保所有计算均以货币为单位。

关于delphi - 在Delphi中比较货币值时如何避免舍入问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/182475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com