我有一个程序,我得到的数字如下:0.18869952857494354248046875
我需要将这些从字符串更改为浮点数,但是当我这样做时,我得到:0.18869952857494354
为什么python会切断~10位数,如何在传输中保留它们?
答案 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