Python中浮点数运算为何意外精确?底层原理探究
为什么Python中这些浮点运算会精确得到0.0?
在多数编程语言里,1.0 - ((1.0/3.0)*3.0)这类计算结果通常接近0但不等于0,但Python里却会精确返回0.0,就连1.0 - (0.1*10)这种看起来理应存在误差的计算也是如此,这背后的核心原因是Python默认采用的IEEE 754双精度浮点数舍入规则。
1. 关于1.0/3.0 *3.0的计算
数学上1/3是无限循环小数,无法用二进制浮点数精确表示,双精度浮点数只能存储最接近它的近似值。当这个近似值乘以3时,得到的结果和精确的1.0之间的差距,刚好小于双精度浮点数的最小精度单位(ULP,Unit in the Last Place)的一半。按照IEEE 754的就近舍入规则(若结果距离两个可表示值相等,则舍入到最低有效位为偶数的那个),这个乘积会被舍入成精确的1.0,所以1.0 -1.0自然就是0.0。
2. 关于0.1*10的计算
你提到0.1在双精度中实际存储为0.1000000000000000055511151231257827021181583404541015625,这个值确实是0.1的近似。但它乘以10后,结果和精确1.0的差距同样小于半个ULP,因此会被舍入为精确的1.0,最终1.0 -1.0等于0.0。
注意
这种“意外精确”只是浮点数舍入规则下的巧合,不是所有类似运算都能得到精确结果。比如0.1 +0.2在Python中依然会返回0.30000000000000004,因为这两个近似值相加后的结果无法被舍入到精确的0.3。
内容的提问来源于stack exchange,提问作者Jim Newton
相关产品推荐
相关产品推荐

