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

Adding decimal numbers to a decimal number not working properly in python

本问题已经有最佳答案,请猛点这里访问。

我试着把十进制数加上一个十进制数,它能正确地工作,但当我做1.1 + 0.1时,我得到1.2000000000000002,但我只希望它等于1.2。当我做1.0 + 0.1时,我得到了1.1,这是完美的,但我没有得到。那么,有没有一种方法可以让我把0000000000000021.2000000000000002中去掉呢?

谢谢。


如前所述,0.1不能在IEEE754浮点中精确表示。你可以读懂为什么每个计算机科学家都应该知道浮点运算或浮点指南。

您可以构造或舍入值:

1
2
3
4
5
6
7
>>> 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'

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

1
2
3
>>> import decimal
>>> decimal.Decimal('1.1')+decimal.Decimal('.1')
Decimal('1.2')

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

1
2
>>> decimal.Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

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

1
2
>>> str(sum(map(decimal.Decimal,['.1','.1','.5','.5'])))
'1.2'

另一种选择是使用有理数库,如分数:

1
2
3
>>> from fractions import Fraction as Fr
>>> Fr(11,10)+Fr(1,10)
Fraction(6, 5)

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


您可以在这里尝试字符串格式和文档。

1
2
>>>"%0.2f" % float(1.1 + 0.1)
'1.20'

甚至:

1
2
>>>"%0.1f" % float(1.1 + 0.1)
'1.2'

至于原因,本文在PEP 327中有明确描述。


这是你问题的字面回答:

1
float(str(1.1 + 0.1)[0:3])

如果您对问题的"原因"感兴趣,请参阅问题注释中提供的链接。