Ruby Float#round更新后的行为更改

时间:2018-08-07 13:26:20

标签: ruby floating-point upgrade compatibility

我正在将存储库从Ruby版本2.3.3升级到2.5.1。测试失败,并且我将原因归结为以下行为:

In version 2.3.3 1.34875.round(4) => 1.3487

In version 2.5.1 1.34875.round(4) => 1.3488

现在,我知道了this change,但我认为这无关紧要,因为a)默认行为被搁置了,b)观察到的更改与建议的默认更改相反。我还知道,浮点数不是准确存储有限小数的好方法,并且精度方面的某些变化可以解释为什么会发生这种变化。但是我不知道,我也不知道如何找出答案。

2 个答案:

答案 0 :(得分:2)

您描述的行为听起来像https://bugs.ruby-lang.org/issues/13138,被认为是一个错误修正,并反向移植到2.3.5。 (我尚未确认是否将其反向移植到哪个2.4.x,但在2.5.0之前它在主干中。)

您认为这是一个精确的问题。 1.34875的浮点表示形式略小于1.34875,因此2.3.3会进行技术上过于正确的操作并四舍五入;较新的版本认识到,鉴于浮点数实际上代表了一个值范围(包括1.34875),因此四舍五入更加一致。

答案 1 :(得分:0)

默认行为不是您建议的那样“独自一人”。有一种新的策略可以舍入到最接近的偶数:https://github.com/ruby/ruby/blob/8d7c380216809ba5bd4a3eec41d7dda61f825ffa/NEWS#core-classes-updates-outstanding-ones-only(搜索舍入)。

您可以使用

> 1.34875.round(4, half: :down)
=> 1.3487 

为了保留2.3.3中的行为,