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

Ruby中的舍入不一致?

  •  2
  • Peter  · 技术社区  · 15 年前

    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?至少,这不是前后矛盾吗?Ruby1.9.1和Ruby1.8.7中的行为是相同的。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    7 年前

    看看我对这个问题的回答

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

    这可能是同一件事

        2
  •  2
  •   Chuck    15 年前

    你用的是浮点数。浮点数不精确。见 http://en.wikipedia.org/wiki/IEEE_754-2008 标准简介。

    简短的版本是:不要在任何需要精确性的地方使用浮动!

        3
  •  1
  •   DigitalRoss    15 年前

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

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

    0.25
    0.50
    0.75
    

    换句话说,处理整数时,fp是完全准确的。算了吧。