我有一个算法正在计算:
result = int(14949283383840498/5262*27115)
正确的结果应该是77033412951888085,但Python3.8给我77033412951888080
我也试过以下方法:
>>> result = 77033412951888085
>>> print(result)
77033412951888085
>>> print(int(result))
77033412951888085
>>> print(float(result))
7.703341295188808e+16
>>> print(int(float(result)))
77033412951888080
当我将float类型强制转换为int类型时,似乎出现了问题。我错过了什么?
PS:我发现使用result = 14949283383840498//5262*27115
我得到正确的答案!
类型转换不是问题。浮点运算在精度方面有限制。见https://docs.python.org/3/tutorial/floatingpoint.html
需要使用整数除法或使用十进制模块,默认使用28位的精度。
使用整数除法
result = 14949283383840498 // 5262 * 27115
print(result)
输出:
77033412951888085
使用十进制模块
from decimal import Decimal
result = Decimal(14949283383840498) / 5262 * 27115
print(result)
输出:
77033412951888085
这是一个精度限制:
result = 14949283383840498/5262*27115
result
7.703341295188808e+16
在本例中,result是浮点数。可以看到精度是15位。将其转换为int,您会看到最后一个非零数字是8,这与打印时显示的结果是正确的:float
尝试以下操作:
print(sys.float_info.dig)
15
dig是浮点数中可以忠实表示的十进制位数的最大数目。
关于这个问题有一个很好的解释。
但是有一些方法可以用Python做得更好,参见Python的文档:
对于需要精确十进制表示的用例,尝试使用实现适合的十进制算术的decimal模块会计应用和高精度应用
fractions模块支持另一种形式的精确算术它实现了基于有理数的算术(那么数字比如1/3可以精确表示)。
如果你经常使用浮点运算,你应该使用a看看NumPy包和许多用于数学和数学的其他包由SciPy项目提供的统计操作