在Python中将float转换为int会导致错误的答案



我有一个算法正在计算:

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项目提供的统计操作

相关内容

  • 没有找到相关文章

最新更新