Ruby 浮点精度

标签 ruby floating-point floating-accuracy

据我了解,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/

相关文章:

ruby - cucumber 解析速度

java - 两个值之间唯一 `double` 的数量

c++ - 浮点除法和隐式轮

C++ union 表示数据内存与 C 标量变量类型

math - float 学有问题吗?

python - 大于或等于 float 失败

ruby-on-rails - #<RSpec 的未定义方法 `visit'

模块内的 ruby​​ 模块

math - float 学有问题吗?

ruby - 了解强制