如何转换科学记数保持精度

时间:2016-07-29 14:58:40

标签: python math scientific-notation

我有一些数字:

1.8816764231589208e-06  <type 'float'>

我如何转换为

0.00000018816764231589208

保留所有精度

2 个答案:

答案 0 :(得分:1)

这不是一个简单的问题,因为二进制浮点数不能总是精确地表示小数分数,而你选择的数字就是这样。

因此,您需要知道所需的精度数字。在您的确切情况下,看看当我尝试使用各种格式打印时会发生什么。

link

正如您将要观察到的,Python很乐意提供许多精度数字,但实际上后者是虚假的:标准Python浮点数以64位存储,但其中只有52个用于表示有效数字,这意味着你最多可以获得16位有效数字。

这里真正的教训是Python无法将1.8816764231589208e-06完全存储为浮点数。这不是语言限制,而是浮点实现的代表性限制。

但是,上面显示的格式可以帮助您解决问题。

答案 1 :(得分:0)

Rory Daulton在评论中表示,您提供的价值未妥善存储。所以你的浮动1.8816764231589208e-06 <type 'float'>可以用这个例子来解释:

>>> 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类型float实际上是Decimal()显示的数字。