python中奇怪的十进制输出

Ali*_*ina 2 python floating-point

我正在使用 python3.9 并尝试计算以下内容:

17.36-14.76。这是一个非常简单的计算,输出应该是 2.6,没有任何其他额外的数字。

但是,在 python3.9 中,我得到以下输出:

>>> 17.36-14.76
2.5999999999999996
Run Code Online (Sandbox Code Playgroud)

我知道,我可以将结果四舍五入以获得所需的输出。但是,我不明白为什么它以一种奇怪的方式计算它,因为 17.36-14.76 不是 2.5999999999999996,17.36-14.76 是 2.6。

python有一些奇怪的设置吗?

xjc*_*jcl 5

这是因为计算机上的浮点运算使用 base-2 来存储数字,而不是我们熟悉的 base-10。这意味着你并没有真正拥有17.3614.76那里(因为你不能在 base-2 中准确地表示它们),但实际上是一个近似值:

>>> f'{17.36:.30}'
'17.3599999999999994315658113919'
>>> f'{14.76:.30}'
'14.759999999999999786837179272'
>>>
>>> f'{17.36-14.76:.30}'
'2.59999999999999964472863211995'
Run Code Online (Sandbox Code Playgroud)

请注意,一些数字(例如1/2和 )1/4实际上可以使用基数 2 精确表示:

>>> f'{.25:.30}'
'0.25'
Run Code Online (Sandbox Code Playgroud)

这就是为什么如果您关心确切的数字(例如货币中的美分值),通常您希望使用整数而不是浮点数。

另一种可能的解决方法是使用Decimal类(它本质上只是记住小数点位置的整数)。在这里传递字符串而不是浮点数很重要:

>>> Decimal('17.36') - Decimal('14.76')
Decimal('2.60')
Run Code Online (Sandbox Code Playgroud)