将Str改为Float会丢失数字

时间:2017-05-07 14:18:23

标签: python python-3.x

我有一个程序,我得到的数字如下:0.18869952857494354248046875

我需要将这些从字符串更改为浮点数,但是当我这样做时,我得到:0.18869952857494354

为什么python会切断~10位数,如何在传输中保留它们?

2 个答案:

答案 0 :(得分:3)

浮点数学的局限性意味着你不能有任意长的浮点数:https://docs.python.org/3/tutorial/floatingpoint.html

您可以使用decimal库(https://docs.python.org/3/library/decimal.html#module-decimal)来解决此问题:

>>> from decimal import Decimal
>>> a = Decimal("0.18869952857494354248046875")
>>> a
Decimal('0.18869952857494354248046875')
>>> b = Decimal("0.111111111111111111111111")
>>> a + b
Decimal('0.29981063968605465359157975')
>>> a * b
Decimal('0.02096661428610483805338539570')

默认情况下,decimal库有28个精度位置,但您可以使用getcontext().prec进行更改:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
>>> getcontext().prec = 60
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857142857142857142857142857')

答案 1 :(得分:1)

这是因为python中的float数据类型最多可以显示16位数的精度。

为了获得更高的精确度(保留所有数字),请使用以下特殊包:mpmath 您可以像使用它一样使用它:

from mpmath import *
mp.dps = 64       #64 decimal places
sqrt(5)/2 #64 digit, high precision