3

我正在尝试将十进制数添加为十进制数,并且它可以正常工作,但是当我这样做时,1.1 + 0.11.2000000000000002希望它等于1.2. 当我这样做时,1.0 + 0.1我得到1.1了完美的结果,但我没有得到1.1 + 0.1。那么有没有办法可以摆脱000000000000002from 1.2000000000000002

谢谢。

4

3 回答 3

7

正如无数次指出的那样,0.1 不能用 IEEE 754 浮点数精确表示。您可以在What Every Computer Scientist Should Know About Floating-Point ArithmeticThe Floating Point Guide中阅读有关原因的所有信息

您可以截断或舍入该值:

>>> 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 模块

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

请注意,您需要从浮点数的字符串表示开始,'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)

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

于 2013-06-15T18:35:29.983 回答
2

您可以尝试字符串格式化,这里的文档

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

甚至:

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

至于为什么,这里在 PEP 327中有明确描述。

于 2013-06-15T18:32:57.327 回答
0

This is the literal answer to your question:

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

If you're interested in the "why" of the problem then refer to the links provided in the question comments.

于 2013-06-15T18:23:20.513 回答