sho*_*hox -2 python math floating-point floating-point-precision
我在python中尝试了这个简单的数学运算
>>> math.floor(8.2-0.21)
7.0
>>> math.floor(8.21-0.2)
8.0
>>> math.floor(8.2-0.2)
7.0
Run Code Online (Sandbox Code Playgroud)
第三个应该返回8但是返回7?!
UPDATE
我在PHP,ruby和JAVA中尝试过,我得到了相同的结果.
更新2 我不知道为什么这个问题得到很多投票!
您引用的语言使用IEEE-754 64位二进制浮点或使用底层硬件的浮点,这可能是IEEE-754二进制浮点.
在IEEE-754 64位二进制浮点中,最接近8.2的可表示值是8.199999999999999289457264239899814128875732421875,并且.2的最接近的可表示值是0.200000000000000011102230246251565404236316680908203125.
所以,当你写的时候8.2 - 0.2,实际发生的是从8.199999999999999289457264239899814128875732421875中减去0.200000000000000011102230246251565404236316680908203125.结果是略低于8的值,而略低于8的值的最低值为7.
这里的教训是浮点运算通常是近似的,因此在评估具有不连续性(如地板)或陡坡的函数时必须小心.您必须设计代码以接受可能跨越不连续性的结果,或者您必须设计计算以避免跨越不连续性的错误.