gpt4 book ai didi

delphi - Delphi如何在乘法过程中对货币进行四舍五入

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

rate : Currency;
mod1 : Currency;
mod2 : Currency;
mod_rate : Currency;

rate := 29.90;
mod1 := 0.95;
mod2 := 1.39;

mod_rate := rate * mod1 * mod2;

如果您在计算器上执行此计算,您将得到值 39.45295。由于 Delphi 的 Currency 数据类型仅精确到小数点后 4 位,因此它会在内部对值进行四舍五入。我的测试表明它使用 Banker 舍入,因此 mod_rate 应包含值 39.4530,但在这种特殊情况下,它会截断为 39.4529

我有 40,000 个这样的计算,除了上面的以外,所有的都是正确的。下面是一个四舍五入的示例:

rate := 32.25;
mod1 := 0.90;
mod2 := 1.15;

这在计算器上等于 33.37875,根据 Banker 的四舍五入结果将是 33.3788,这正是 Delphi 所做的。

有人可以解释一下 Delphi 在这里做什么吗?

最佳答案

货币计算在 FPU 中以扩展精度进行,即使货币本身是 64 位整数值。

您遇到的问题是浮点二进制表示,而不是舍入错误。您可以在这里看到 39.45295 的浮点表示形式:What is the exact value of a floating-point variable?

39.45295 = + 39.45294 99999 99999 99845 67899 95771 03240 88111 51981 35375 97656 25

扩展精度值低于 39.45295,因此向下舍入。

使用十进制算术库来避免此类错误。

<小时/>

要查看浮点运算是在 fpu 中执行货币计算的,下面是反汇编:

mod_rate := rate * mod1 * mod2;
0041D566 DF2D20584200 fild qword ptr [$00425820]
0041D56C DF2D28584200 fild qword ptr [$00425828]
0041D572 DEC9 fmulp st(1)
0041D574 DF2D30584200 fild qword ptr [$00425830]
0041D57A DEC9 fmulp st(1)
0041D57C D835C4D54100 fdiv dword ptr [$0041d5c4]
0041D582 DF3D38584200 fistp qword ptr [$00425838]
0041D588 9B wait

fmulpfdiv 以扩展精度完成。如果使用整数运算,则指令将是 fimulfidiv

关于delphi - Delphi如何在乘法过程中对货币进行四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799079/

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