Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Float#更新后圆形行为改变_Ruby_Floating Point_Upgrade_Compatibility - Fatal编程技术网

Ruby Float#更新后圆形行为改变

Ruby Float#更新后圆形行为改变,ruby,floating-point,upgrade,compatibility,Ruby,Floating Point,Upgrade,Compatibility,我正在将一个存储库从Ruby版本2.3.3升级到2.5.1。测试失败,我已将原因缩小为以下行为: 版本2.3.3中的 1.34875.圆形(4) =>1.3487 版本2.5.1中的 1.34875.圆形(4) =>1.3488 现在,我知道了,但我不认为这有什么关系,因为a)违约行为被忽略了,b)观察到的变化与提议的违约变化相反。我也知道浮点数不是准确存储有限小数的好方法,精度的一些变化可能解释了为什么会发生这种变化。但我不知道,我也不知道如何去发现 您描述的行为听起来像是一个错误修复,并被后

我正在将一个存储库从Ruby版本2.3.3升级到2.5.1。测试失败,我已将原因缩小为以下行为:

版本2.3.3中的

1.34875.圆形(4)
=>1.3487

版本2.5.1中的

1.34875.圆形(4)
=>1.3488


现在,我知道了,但我不认为这有什么关系,因为a)违约行为被忽略了,b)观察到的变化与提议的违约变化相反。我也知道浮点数不是准确存储有限小数的好方法,精度的一些变化可能解释了为什么会发生这种变化。但我不知道,我也不知道如何去发现

您描述的行为听起来像是一个错误修复,并被后传到了2.3.5。(我还没有确认它的后端口是哪一个2.4.x,如果有的话,但它是在2.5.0之前的后备箱中。)


正如你所猜测的,这是一个精确性问题。1.34875的浮点表示法略小于1.34875,因此2.3.3做了技术上过于正确的事情,并向下取整;较新的版本认识到,如果浮点实际上代表一系列值[包括1.34875],则向上取整更为一致。

默认行为并不像您所建议的那样“被忽略”。有一种新的策略可以将整数舍入到最接近的偶数:(搜索整数)

你可以用

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

为了保留2.3.3中的行为。

您的第一个示例看起来是截断的,而不是四舍五入的…@Anthony尽管如此,您在2.3.3中得到的结果在这里更相关;默认值在提交之后和发布之前更改(如问题中链接的bug所述)。发布的行为是,而且一直是,
half::up
。我认为这不是真的。如果你叫0.5轮,1.5轮,2.5轮等等(在2.3.3和2.5.1中),你得到1,2,3,。。。而不是0,2,2,。。。如果默认行为发生变化,情况也会如此。事实上,我很确定你引用的更改是在OP链接中还原的更改。@matthewd你100%肯定吗?我记得读过一篇文章,关于为什么舍入到甚至可以提供更统一的舍入或其他东西,我非常确定这在ruby中是一种行为……这在我看来是合理的——我也认为这是一个错误修复。我想重新定义round以复制旧的行为,这样我就可以知道我的测试失败是由于这个特殊的改变还是由于另一个我需要调查的改变。你能想出一个办法吗?(我真的不知道如何阅读您提供的链接)不,它的级别似乎太低,无法有效覆盖(除了在ruby land中完全重新实现舍入,这似乎……不好玩)。我建议更改您在2.3.3上的测试,以便最终使用不同的值(在两个版本中“正常”四舍五入);如果升级后修改后的测试仍然通过,那对我来说就足够了。。。但这似乎更可能引入不确定性,而不是消除不确定性,依我看。公平地说,许多不确定性都是自动生成的,而且很难测试,因此我们要做很多长的直接字符串比较(我知道这是一件坏事)。我定义了一个round方法,它调用super并将“#{foo}rounds放入#{bar}”,这样,如果我看到一个更改并同意舍入,我就可以忽略失败并检查其他错误。不完美,但可以管理。谢谢你的回答!沿着这些思路,我想您可以定义一个常量哈希表来覆盖某些浮点及其舍入:您不必通过算法重现旧的行为,只需针对遇到的特定数字强制执行它即可。