【问题标题】:Inconsistent rounding in Ruby?Ruby中的舍入不一致?
【发布时间】:2023-04-09 11:57:01
【问题描述】:

Ruby 的舍入是否存在错误?为什么会这样:

>> [1.14, 1.15, 1.16].map{|x| "%.1f" % x}
=> ["1.1", "1.1", "1.2"]
>> [1.4, 1.5, 1.6].map{|x| "%.0f" % x}
=> ["1", "2", "2"]

例如,为什么 1.15 舍入为 1.1,而 1.5 舍入为 2?至少,这不是矛盾的吗? ruby 1.9.1 和 ruby​​ 1.8.7 中的行为是相同的。

【问题讨论】:

标签: ruby


【解决方案1】:

看看我对这个问题的回答

Why does Perl's sprintf not round floating point numbers correctly?

这可能是一回事

【讨论】:

  • 嘿嘿,我什至没有想到这一点。回想起来很有意义。
【解决方案2】:

您正在使用浮点数。浮点数并不精确。有关标准的介绍,请参阅http://en.wikipedia.org/wiki/IEEE_754-2008

简短的版本是:永远不要在任何需要精确的地方使用浮点数!

【讨论】:

    【解决方案3】:

    回忆起来很有用,思考起来也很讽刺,但浮点数只能准确地表示:(a) 几个分数或 (b) 所有整数。

    因此,要获得精确的表示,分数必须由 2 的(负)幂组成。因此,以下分数是 0.01 到 0.99 之间唯一精确表示的分数:

    0.25
    0.50
    0.75
    

    换句话说,FP 在处理整数时非常准确。去图吧。

    【讨论】:

    • 这听起来不对。您应该得到可以在尾数中表示的所有负指数的确切答案(维基百科告诉我现在称为“有效数字”——一定是在我上学之后发生的)。所以2**1/n 应该适用于任何可以放入尾数的n。没有?
    • 几乎,但仅当 n 是 2 的幂时。因此,由 1/2, 1/4, 1/8, 1/16, 1/32, ... 中的一个或多个项组成的分数可以精确表示。
    • “当 n 是 2 的幂”——嗯,没错,这就是我的意思 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多