6 ruby math floating-point ieee-754
为什么7.30 - 7.20
ruby中的代码会返回0.0999999999999996
,不是0.10
吗?
但是,如果我会写7.30 - 7.16
,例如,一切都会好的,我会得到的0.14
.
问题是什么,我该如何解决?
问题是我们可以很容易地用十进制写的一些数字在当前硬件实现的特定浮点格式中没有精确的表示.说明这一点的一种随意方式是所有整数都有,但不是所有的分数,因为我们通常用2**e
指数存储分数.所以,你有3个选择:
适当地结束.不结果的结果总是非常接近,所以圆润的结果总是"完美".这就是Javascript的作用,很多人甚至都没有意识到JS在浮动点上做了一切.
使用定点算术.Ruby实际上让这很容易; 随着数字越来越大,这是唯一一种从Fixnum无缝转换到Class Bignum的语言之一.
使用旨在解决此问题的类,例如 BigDecimal
为了更详细地查看问题,我们可以尝试用二进制表示"7.3".7部分很容易,111,但我们怎么做.3?111.1是7.5,太大了,111.01是7.25,越来越近了.事实证明,111.010011是"下一个最接近的较小数字",7.296875,当我们尝试填补缺失的.003125时,我们最终发现它只是111.010011001100110011 ...永远,在我们选择的有限位字符串编码中无法表示.