有没有人有这一个任何想法?

当我们运行:

printf("%.0f", 40.5)

在Windows中返回的是“41”,但我们的生产Ubuntu的服务器上我们得到的“40”

有帮助吗?

解决方案

看起来像二进制浮点数不精确的简单情况。在一台机器,你得40.499999999这轮40;在另一台机器上你40.500000000001其中舍入到41。

如果您需要确切的数字,那么你不应该使用二进制浮点。可以使用定点小数或十进制浮点。

编辑:你使用BigDecimal的,你说。为什么不回避任何转换使用#round然后漂浮#to_i? (或#floor#ceil而不是<=>?目前还不清楚你的目标是什么。)

b = BigDecimal.new("40.5")
print b.round.to_i  # => 41

其他提示

如何使用.round呢?轨道甚至增强其功能,让您可以指定精度(看到API DOC )。

使用%0.0克代替

ScottJ的答案并不能解释你的问题 - 40.5是二进制精确表示。什么是可能发生的事情是这样的:‘四舍五入甚至一半的’Windows' printf‘上舍半了,’和Ubuntu的printf

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top