使用Ruby的printf格式说明符奇四舍五入问题
-
10-07-2019 - |
题
有没有人有这一个任何想法?
当我们运行:
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
不隶属于 StackOverflow