使用 ruby​​ printf-format-specifier 的奇数舍入问题

发布于 2024-08-13 03:38:26 字数 136 浏览 5 评论 0原文

有人对此有任何想法吗?

当我们运行:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

白鸥掠海 2024-08-20 03:38:26

使用 .round 来代替怎么样? Rails 甚至增强了它,以便您可以指定精度(请参阅 API文档)。

How about using .round instead? Rails even enhances it so that you can specify the precision (see API doc).

方觉久 2024-08-20 03:38:26

使用 %.0g 代替

use %.0g instead

清秋悲枫 2024-08-20 03:38:26

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."

末蓝 2024-08-20 03:38:26

看起来像二进制浮点不精确的简单情况。在一台机器上,您得到 40.499999999,四舍五入为 40;在另一台机器上,您会得到 40.500000000001,四舍五入到 41。

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

编辑:你说你正在使用 BigDecimal。为什么不先使用 #round 然后使用 #to_i 来避免转换为浮点型呢? (或者用 #floor#ceil 而不是 #round...尚不清楚您的目标是什么。)

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

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.)

b = BigDecimal.new("40.5")
print b.round.to_i  # => 41
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文