如何以科学计数法计算和存储数字?

How to calculate and store the number in scientific notation?

我正在使用 Python 来模拟统计物理,所以我会处理小数字。

例如,

a = 2.22e-300, b = 3e-200

我想计算

a * b = 6.66e-500.

然而,在 Python 3 中显示 0.0。

我想设计一个数据类型:第一部分存储浮点数,这里是6.66,第二部分存储量级,也就是-500。

请问如何实现?或者有什么更好的方法来处理科学数字?

我强烈建议您使用 built-in decimal 模块之类的东西,并根据您的需要提高其精度。例如:

>>> from decimal import *
>>> getcontext().prec = 100
>>> a = Decimal("2.22e-300")
>>> b = Decimal("3e-200")
>>> a
Decimal('2.22E-300')
>>> b
Decimal('3E-200')
>>> a*b
Decimal('6.66E-500')

请注意,为了安全起见,我使用 字符串 创建了 ab,例如 "3e-200"decimal 模块正确解析它们。如果不是,它将首先将它们转换为 Python 的不精确浮点数,并在将它们传递给 Decimal 对象之前将它们弄乱。

在上面的代码中,我们将精度设置为 100。

创建 class:

class Sci_note:
    def __init__(self, base, exp):
        self.base = base
        self.exp = exp
    def __mul__(self, other):
        return Sci_note(self.base * other.base,
                        self.exp + other.exp)
    def __str__(self):
        return str(self.base) + 'e' + str(self.exp)

它的功能如您所料:

>>> a = Sci_note(2.22, -300)
>>> b = Sci_note(3, -200)
>>> c = a * b
>>> c.base
6.66
>>> c.exp
-500

更新

我添加了一个 __str__ 方法(上面),因此它们在打印时可以正确显示:

>>> print(a)
2.22e-300

当然,我这里只实现了乘法的方法,其他的就交给大家自己实现了。可能你只需要乘法,所以我现在写它们会浪费大家的时间!

此外,创建一个 __float__ 处理程序在这里也没有用,因为 Python 不能 处理订单 ^-300,所以 return 它们是没有用的,因为我们只会得到 0!