据我了解,Ruby (1.9.2) float 的精度为 15 位十进制数字。因此,我希望将 float x 舍入到小数点后 15 位将等于 x。对于此计算,情况并非如此。
x = (0.33 * 10)
x == x.round(15) # => false
顺便说一句,四舍五入到 16 位返回 true。
你能给我解释一下吗?
最佳答案
部分问题是 0.33 在底层格式中没有精确的表示,因为它不能用一系列 1/2n 项来表示。因此,当它乘以 10 时,乘以的数字与 0.33 略有不同。
就此而言,3.3 也没有精确表示。
第一部分
当数字没有精确的 10 进制表示时,在转换尾数中有信息的最低有效位时会有余数。这个余数将向右传播,可能永远传播,但它基本上没有意义。这个错误的明显随机性与解释你和 Matchu 明显不一致的舍入的原因相同。注意到了。这是第二部分。
第二部分
并且此信息(最右边的位)与单个十进制数字所传达的信息不完全对齐,因此如果原始精度更高,则十进制数字通常会比其值小一些。
这就是为什么转换可能会在 15 位时舍入为 1 并在 16 位时舍入为 0.x:因为较长的转换对于尾数末尾右侧的位没有值(value)。
关于Ruby 浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7312242/