Python 如何转换保留精度的科学记数法

Python 如何转换保留精度的科学记数法,python,math,scientific-notation,Python,Math,Scientific Notation,我有一些数字,比如: 1.8816764231589208e-06 <type 'float'> 保留所有精度这不是一个容易的问题,因为二进制浮点数不能始终精确地表示小数,而您选择的数字就是这样一个数字 因此,您需要知道需要多少位精度。在你的情况下,看看当我尝试用各种格式打印它时会发生什么 >>> x = 1.8816764231589208e-06 >>> for i in range(10, 30): ... fmt = "{:.%

我有一些数字,比如:

1.8816764231589208e-06  <type 'float'>

保留所有精度这不是一个容易的问题,因为二进制浮点数不能始终精确地表示小数,而您选择的数字就是这样一个数字

因此,您需要知道需要多少位精度。在你的情况下,看看当我尝试用各种格式打印它时会发生什么

>>> x = 1.8816764231589208e-06
>>> for i in range(10, 30):
...     fmt = "{:.%df}" % i
...     print fmt, fmt.format(x)
... 
{:.10f} 0.0000018817
{:.11f} 0.00000188168
{:.12f} 0.000001881676
{:.13f} 0.0000018816764
{:.14f} 0.00000188167642
{:.15f} 0.000001881676423
{:.16f} 0.0000018816764232
{:.17f} 0.00000188167642316
{:.18f} 0.000001881676423159
{:.19f} 0.0000018816764231589
{:.20f} 0.00000188167642315892
{:.21f} 0.000001881676423158921
{:.22f} 0.0000018816764231589208
{:.23f} 0.00000188167642315892079
{:.24f} 0.000001881676423158920791
{:.25f} 0.0000018816764231589207915
{:.26f} 0.00000188167642315892079146
{:.27f} 0.000001881676423158920791458
{:.28f} 0.0000018816764231589207914582
{:.29f} 0.00000188167642315892079145823
>>> 
正如您将看到的,Python很乐意提供许多精度数字,但事实上后面的数字是假的:标准Python浮点存储在64位中,但其中只有52位用于表示有效数字,这意味着您最多可以获得16位有效数字

这里真正的教训是Python无法准确地将1.8816764231589208e-06存储为浮点数。这与其说是语言限制,不如说是浮点实现的代表性限制


但是,上面显示的格式可能允许您解决问题。

您提供的值没有按照Rory Daulton在评论中的建议正确存储。因此,您的浮点
1.8816764231589208e-06可以通过以下示例进行解释:

>>> from decimal import Decimal
>>> a = 1.8816764231589208e-06
>>> g = 0.0000018816764231589208        # g == a

>>> Decimal(a)                          # Creates a Decimal object with the passed float
Decimal('0.000001881676423158920791458225373060653140555587015114724636077880859375')

>>> Decimal('0.0000018816764231589208') # Exact value stored using str
Decimal('0.0000018816764231589208')     

>>> Decimal(a) == Decimal('0.0000018816764231589208')
False                                   # See the problem here? Your float did not
                                        # represent the number you "saw"

>>> Decimal(a).__float__()              
1.8816764231589208e-06

>>> Decimal(a).__float__() == a
True

如果需要精确的小数,请使用Decimal或其他类来表示数字,而不是使用二进制表示法(如浮点)。您的
float
类型的
0.0000018816764231589208
实际上是由
Decimal()

显示的数字。您是说您已经将该值存储在变量中,还是将其作为字符串存储在变量中?你所说的“精度”是什么意思:存储准确的值,还是保留并显示“正确”的有效位数,或者其他?或者你的意思是要打印到小数点后的某个数字?您给出的问题不清楚。您可以将其格式化为:
“{.20f}”。格式化(num)
,其中20是您想要的有效数字的多少。我随便挑了20个。这就是你们想要的吗?第一个数字被计算成浮点数,我需要一个从科学记数法到十进制的正确转换,不需要任何符号round@peterWang我需要一个正确的计算,不仅仅是加前导零,我希望你们知道浮点变量不能准确地存储那个值。因此,如果您希望准确打印存储的值,可能会得到0.00000188167642315892079145822537306531405587015114724636077880859375。这就是你想要的吗?如果是,请查看十进制模块。
>>> from decimal import Decimal
>>> a = 1.8816764231589208e-06
>>> g = 0.0000018816764231589208        # g == a

>>> Decimal(a)                          # Creates a Decimal object with the passed float
Decimal('0.000001881676423158920791458225373060653140555587015114724636077880859375')

>>> Decimal('0.0000018816764231589208') # Exact value stored using str
Decimal('0.0000018816764231589208')     

>>> Decimal(a) == Decimal('0.0000018816764231589208')
False                                   # See the problem here? Your float did not
                                        # represent the number you "saw"

>>> Decimal(a).__float__()              
1.8816764231589208e-06

>>> Decimal(a).__float__() == a
True