Ruby Float#round 更新后行为改变

Ruby Float#round behaviour change after update

我正在将存储库从 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) 观察到的变化与提议的变化相反默认。我也知道浮点数不是准确存储有限小数的好方法,精度的一些变化可能解释了为什么会发生这种变化。但我不知道,我不知道如何找出答案。

您描述的行为听起来像 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]。

默认行为不是您建议的 "left alone"。有舍入到最接近偶数的新策略:https://github.com/ruby/ruby/blob/8d7c380216809ba5bd4a3eec41d7dda61f825ffa/NEWS#core-classes-updates-outstanding-ones-only(搜索 round)。

您可以使用

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

保留 2.3.3 中的行为。