使用 ruby printf-format-specifier 的奇数舍入问题
有人对此有任何想法吗?
当我们运行:
printf("%.0f", 40.5)
在 Windows 机器上,返回值为“41”,但在我们的生产 ubuntu 服务器上,我们得到“40”
Has anybody got any ideas on this one?
When we run:
printf("%.0f", 40.5)
On a windows box the return is "41" but on our production ubuntu server we're getting "40"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用
.round
来代替怎么样? Rails 甚至增强了它,以便您可以指定精度(请参阅 API文档)。How about using
.round
instead? Rails even enhances it so that you can specify the precision (see API doc).使用 %.0g 代替
use %.0g instead
ScottJ 的答案并不能解释你的问题——40.5 可以用二进制精确表示。可能发生的情况是这样的:Windows 的 printf “向上舍入一半”,而 Ubuntu 的 printf “偶数舍入一半”。
ScottJ's answer does not explain your problem -- 40.5 is exactly representable in binary. What's probably happening is this: Windows' printf "rounds half up," and Ubuntu's printf "rounds half even."
看起来像二进制浮点不精确的简单情况。在一台机器上,您得到 40.499999999,四舍五入为 40;在另一台机器上,您会得到 40.500000000001,四舍五入到 41。
如果您需要精确的数字,那么您不应该使用二进制浮点数。您可以使用定点小数,或小数浮点。
编辑:你说你正在使用 BigDecimal。为什么不先使用
#round
然后使用#to_i
来避免转换为浮点型呢? (或者用#floor
或#ceil
而不是#round
...尚不清楚您的目标是什么。)Looks like a simple case of binary floating point imprecision. On one machine you get 40.499999999 which rounds to 40; on the other machine you get 40.500000000001 which rounds to 41.
If you need exact numbers then you should not use binary floating point. You can use fixed point decimal, or decimal floating point.
Edit: you're using BigDecimal, you say. Why not avoid any conversion to float by using
#round
and then#to_i
? (Or#floor
or#ceil
instead of#round
... it's not clear what your goal is.)