代码之家  ›  专栏  ›  技术社区  ›  tsdbrown

使用ruby printf格式说明符的奇数舍入问题

  •  1
  • tsdbrown  · 技术社区  · 15 年前

    有人对此有什么想法吗?

    当我们运行:

    printf("%.0f", 40.5)

    在Windows系统中,返回值为“41”,但在我们的生产Ubuntu服务器上,返回值为“40”

    4 回复  |  直到 14 年前
        1
  •  0
  •   ScottJ    15 年前

    看起来像一个简单的案例 binary floating point imprecision .在一台机器上你得到40.49999999,四舍五入到40;在另一台机器上你得到40.500000000001,四舍五入到41。

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

    编辑:你说你用的是bigdecimal。为什么不使用 #round 然后 #to_i ?(或) #floor #ceil 而不是 六轮 …不清楚你的目标是什么。)

    b = BigDecimal.new("40.5")
    print b.round.to_i  # => 41
    
        2
  •  2
  •   ujh    15 年前

    使用怎么样 .round 相反?Rails甚至增强了它,以便您可以指定精度( see API doc )

        3
  •  1
  •   aykoc    15 年前

    改用%.0g

        4
  •  1
  •   Rick Regan    14 年前

    Scottj的答案并不能解释你的问题——40.5可以用二进制表示。可能发生的情况是:Windows的printf“向上取整一半”,Ubuntu的printf“向上取整一半”。