将十进制数添加到十进制数不能在python中正常工作

use*_*537 1 python numbers decimal

我正在尝试将十进制数字添加到十进制数字并且它正常工作,但是当我这样做时,1.1 + 0.1我得到1.2000000000000002但是我希望它等于是1.2.当我这样做的时候,1.0 + 0.1我会得到1.1哪个是完美的,但我不会那样做1.1 + 0.1.那么有什么方法可以摆脱000000000000002来自1.2000000000000002

谢谢.

daw*_*awg 6

如无数次所述,0.1无法在IEEE 754浮点中精确表示.您可以阅读有关为什么每个计算机科学家应该知道浮点运算浮点指南的原因

您可以对值进行trucate或round:

>>> round(1.1+.1,2)
1.2
>>> "%.*f" % (1, 1.1+.1 )
'1.2'
>>> s=str(1.1+.1)
>>> s[0:s.find('.')+2]
'1.2'
Run Code Online (Sandbox Code Playgroud)

如果要精确表示这些值,请考虑使用Decimal模块:

>>> import decimal
>>> decimal.Decimal('1.1')+decimal.Decimal('.1')
Decimal('1.2')
Run Code Online (Sandbox Code Playgroud)

请注意,您需要从float的字符串表示开始,'0.1'因为0.1在IEEE浮点中二进制不能完全表示:

>>> decimal.Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Run Code Online (Sandbox Code Playgroud)

然后在计算后返回字符串表示,您可以使用str:

>>> str(sum(map(decimal.Decimal,['.1','.1','.5','.5'])))
'1.2'
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用有理数字库,例如Fractions:

>>> from fractions import Fraction as Fr
>>> Fr(11,10)+Fr(1,10)
Fraction(6, 5)
Run Code Online (Sandbox Code Playgroud)

有了这个结果,你仍然需要舍入,截断或使用任意精度算术包来获得一个确切的数字(取决于输入......)


Ble*_*ers 0

这是您问题的字面答案:

float(str(1.1 + 0.1)[0:3])
Run Code Online (Sandbox Code Playgroud)

如果您对问题的“原因”感兴趣,请参阅问题评论中提供的链接。