gpt4 book ai didi

delphi - 两台不同计算机中的奇怪 RoundTo 函数行为

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

问题简单又奇怪!我在Delphi中编写了一个程序并使用了roundto函数。在一台计算机中 1.5 四舍五入为 2,而在另一台计算机中则四舍五入为 1。怎么会发生这种事?

PS:代码------> Roundto(1.5, 0)

P.S 2:似乎需要更多信息,所以我发布了更准确的细节。我写了一个程序。他们输入了两个数字:a=7231.76 b=3556.71现在,如果 c >= a - b,他们可以输入第三个数字 c,但我的代码中的确切格式是

`roundto(c, -1) >= roundto(a, -1) - roundto(b, -1)`
`roundto(a, -1) = 7231.8`
`roundto(b, -1) = 3556.7`

所以

`roundto(a, -1) - roundto(b, -1) = 3675.1`

他们进入

`c = 3675.05`

我跟踪了该程序。在一台计算机上显示 round(c, -1) = 3675.1,在另一台计算机上显示 round(c, -1) = 3675.0

最佳答案

我想说您遇到了“银行四舍五入”问题,并且您发布了错误的数据:-)Delphi RoundTo 实现了银行家的舍入:以 0.5 结尾的奇数向上舍入,这是传统行为,但是...以 0.5 结尾的偶数向下舍入!因此 1.5 舍入为 2.0,但 2.5 舍入为 2.0(链接到 RoundTo 的引用)

第二种可能性:http://www.merlyn.demon.co.uk/pas-chop.htm#DRT Delphi 的某些版本中存在错误。您的所有机器上都有相同版本的 Delphi 吗?

第三种可能性:你说的是 float !它们不是确切的数字!将它们相加和相减会创建一个通常看不见的小数微观世界 0.1 + 0.2 != 0.3!!也许您看到的 0.5 并不完全是 0.5,而是 0.49999999 或 0.500000001。如果您想检查它,请进入调试器并检查 c = 3675.05 (逻辑表达式)是 true 还是 false,如果 round(c, -1) = 3675.1 > 是真是假等等。如果你想探索 FP 世界,试试这个:http://pages.cs.wisc.edu/~rkennedy/exact-float

第四种可能性:如果您使用 Single 或 Double,则 3675.05 的舍入会发生变化。 Single 是 3675.1,Double 是 3675 ​​:-) 啊... float 的神奇世界 :-)

当你想玩数学技巧时,请使用货币类型(它是定点数,不存在这些问题)。

还有最后一种可能性,但可能性很小:Intel CPU 将 Double 运算的中间结果存储为 80 位 fp,然后在输出时将它们“舍入”为 64 位。一些编译器/语言引入了可选的优化(如果可能的话,在程序运行时激活)以使用某些处理器中存在的 SSE2 操作码而不是处理器的 FPU。 SSE2 在 64 位 fp 上运行,因此不会向上转换为 80 位,也不会从 80 位向下转换。这可能会导致您所看到的情况。阅读此处 Differences between x87 FPU and SSE2 .

关于delphi - 两台不同计算机中的奇怪 RoundTo 函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7722416/

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