Python中整数除法为何比浮点除法更精确?是否应优先使用?
整数除法 vs 浮点除法的精度差异问题
先看你给出的可复现代码:
int(1414213562*1414213561/2) Out[6]: 999999998765257088 int(1414213562*1414213561//2) Out[7]: 999999998765257141
第二个结果是精确值,原因可以从以下两点解释:
1. Python的float本质是双精度浮点数,有精度上限
Python里的float类型固定是双精度浮点数(64位),不会自动切换到更高精度。双精度浮点数的有效二进制位数是53位,对应十进制的话,只能精确表示小于2^53(约9.007×10^15)的整数。
而你计算的1414213562*1414213561结果约为2×10^18,远大于2^53,所以这个乘积在转换成浮点数时已经被近似存储了——浮点数无法精确表示这么大的整数,会丢失低位信息。后续的/2运算基于这个近似值,最后转int自然得到错误结果。
2. Python的整数运算为任意精度,无精度损失
Python的int类型支持任意精度运算,不管数值多大,只要内存足够,就能精确存储和计算。//是整数除法,全程基于整数运算,不会涉及浮点数的近似,因此能得到完全精确的结果。
结论:已知分子能被分母整除时,务必用整数除法
只要确定最终结果是整数,就应该优先使用整数除法//(或者先做整数乘法再整除),避免浮点运算带来的精度损失。哪怕数值看起来不大,一旦超过浮点数的精确表示范围,就会出现类似的错误,而整数运算能彻底规避这个问题。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

