怎么来0.7-0.5-0.2 => -5.551115123125783e-17?

时间:2014-04-12 07:38:52

标签: ruby floating-point decimal

我不知道如何处理这样的问题:

0.7. - 0.5. - 0.2 # => -5.551115123125783e-17

An article指向What Every Computer Scientist Should Know About Floating-Point ArithmeticTHE FLOATING-POINT GUIDE的链接。他们描述了为什么某些近似值和不准确性是不可避免的。但我还是不知道。任何解释为什么结果远离预期以及计算器如何处理问题将有助于理解问题。

2 个答案:

答案 0 :(得分:1)

正如您从资源中找到的,您链接到浮点数是近似值。你是对的,对于浮点数,你会有不准确的表示。

在大多数情况下,这些小的不准确性最终会在执行计算时取消。例如。大于5的东西+小于3的东西几乎就是8。

浮点可以表示值的准确度取决于值本身。介于-1和0之间以及0和1之间的数字更难以准确地表示它们越接近0.此范围之外的数字越远离它们越远越不准确。

您所展示的案例是表示.7,.5和.2的不准确性导致结果中出现更大误差的情况。

对于计算器,大多数计算器实际上并不使用二进制浮点数。它们使用任意精度的固定点或十进制浮点。固定点数不具有浮点数所具有的精度不准确性。这是以他们能够代表的数字范围为代价的。十进制浮点不具有相同类型的表示错误,因为它不必在存储它们之前将数字从十进制转换为二进制。它仍然可能遭受舍入错误。

答案 1 :(得分:0)

浮点数(通常)是二进制的,有些分数只能用有限位数的二进制分数近似,从而导致您看到的行为。
请注意,小数部分出现完全相同的问题。例如(到小数点后6位)

    1.0 / 3.0 = 0.333333
    3.0 * 0.333333 = 0.999999

我认为分数的二进制近似值看起来令人惊讶的原因虽然十进制值不是因为我们所以熟悉后者,我们几乎不会再注意到它们了! / p>