据我了解,Ruby (1.9.2) 浮点数的精度为 15 位十进制数字。因此,我期望舍入浮动x精确到小数点后 15 位等于x。对于此计算,情况并非如此。
x = (0.33 * 10)
x == x.round(15) # => false
顺便说一下,四舍五入到 16 位会返回 true。
你能向我解释一下吗?
Part of the problem is that 0.33 does not have an exact representation in the underlying format, because it cannot be expressed by a series of 1 / 2n terms. So, when it is multiplied by 10 a number slightly different than 0.33 is being multiplied.
对于这个问题,3.3也没有准确的表示。
Part One
当数字没有精确的以 10 为基数的表示形式时,在转换尾数中包含信息的最低有效数字时,将会产生余数。这个余数将向右传播,可能永远传播,但这基本上没有意义。这个错误的明显随机性是由于同样的原因解释了明显不一致的舍入和Matchu注意到了。那是第二部分。
Part Two
并且此信息(最右边的位)与单个十进制数字所传达的信息并不完全对齐,因此十进制数字通常会比原始精度更高时其值要小一些。
这就是为什么转换可能在 15 位数字处舍入为 1,在 16 位数字处舍入为 0.x:因为较长的转换对于尾数末尾右侧的位没有值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)