我正在尝试将十进制数字添加到十进制数字并且它正常工作但是当我1.1 + 0.1
时,我得到1.2000000000000002
但我想要它等于1.2
。当我做1.0 + 0.1
时,我得到1.1
这是完美的,但我没有得到1.1 + 0.1
。那么我有没有办法摆脱000000000000002
的{{1}}?
感谢。
答案 0 :(得分:6)
如无数次所述,0.1无法在IEEE 754浮点中准确表示。您可以在What Every Computer Scientist Should Know About Floating-Point Arithmetic或The Floating Point Guide
中阅读有关原因的所有信息您可以对值进行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'
如果您想要完全表示这些值,请考虑使用Decimal module:
>>> import decimal
>>> decimal.Decimal('1.1')+decimal.Decimal('.1')
Decimal('1.2')
请注意,您需要从float '0.1'
的字符串表示开始,因为0.1
在IEEE浮点中的二进制文件中不能完全表示:
>>> decimal.Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
要在计算后返回字符串表示,可以使用str
:
>>> str(sum(map(decimal.Decimal,['.1','.1','.5','.5'])))
'1.2'
另一种选择是使用有理数字库,例如Fractions:
>>> from fractions import Fraction as Fr
>>> Fr(11,10)+Fr(1,10)
Fraction(6, 5)
使用该结果,您仍然需要舍入,截断或使用任意精度算术包来获得精确数字(取决于输入...)
答案 1 :(得分:1)
您可以尝试字符串格式化documentation here。
>>> "%0.2f" % float(1.1 + 0.1)
'1.20'
甚至:
>>> "%0.1f" % float(1.1 + 0.1)
'1.2'
至于为什么,它在PEP 327 here上明确描述。
答案 2 :(得分:0)
这是您问题的字面答案:
float(str(1.1 + 0.1)[0:3])
如果您对问题的“原因”感兴趣,请参阅问题评论中提供的链接。