编程语言
首页 > 编程语言> > python浮点数

python浮点数

作者:互联网

参见英文答案 > Is floating point math broken?                                    31个
我有点困惑为什么python在这种情况下添加一些额外的十进制数,请帮忙解释一下

>>> mylist = ["list item 1", 2, 3.14]
>>> print mylist ['list item 1', 2, 3.1400000000000001]

解决方法:

浮点数是近似值,它们不能精确地存储十进制数.因为它们试图仅以64位表示非常大的数字范围,所以它们必须在某种程度上接近.

了解这一点非常重要,因为它会导致一些奇怪的副作用.例如,您可能会非常合理地认为十批0.1的总和为1.0.虽然这似乎是合乎逻辑的,但在浮点时它也是错误的:

>>> f = 0.0
>>> for _ in range (10):
...  f += 0.1
...
>>> print f == 1.0
False
>>> f
0.99999999999999989
>>> str(f)
1.0

您可能认为n / m * m == n.浮点世界再一次不同意:

>>> (1.0 / 103.0) * 103.0
0.99999999999999989

或者也许同样奇怪的是,人们可能会认为对于所有n,n 1!= n.在浮点土地上,数字不能像这样工作:

>>> 10.0**200
9.9999999999999997e+199
>>> 10.0**200 == 10.0**200 + 1
True
# How much do we have to add to 10.0**200 before its 
# floating point representation changes?
>>> 10.0**200 == 10.0**200 + 10.0**183
True
>>> 10.0**200 == 10.0**200 + 10.0**184
False

有关问题的优秀摘要,请参见What every computer scientist should know about floating point numbers.

如果您需要精确的十进制表示,请查看decimal模块,这是自2.4以来python标准库的一部分.它允许您指定有效数字的数量.缺点是,它比浮点慢得多,因为浮点运算是在硬件中实现的,而十进制运算完全是在软件中实现的.它也有自己的不精确问题,但如果你需要十进制数的精确表示(例如,对于金融应用程序),它是理想的.

例如:

>>> 3.14
3.1400000000000001
>>> import decimal
>>> decimal.Decimal('3.14')
>>> print decimal.Decimal('3.14')
3.14
# change the precision:
>>> decimal.getcontext().prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')
>>> decimal.getcontext().prec = 28
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')

标签:numerical,python,floating-point,floating-accuracy
来源: https://codeday.me/bug/20190917/1808790.html