在 Python 中精确乘以非常大的数字

Multiply Very Large Numbers Accurately in Python

我试图在 Python 中将非常大的浮点数乘以非常大的整数,但我注意到一些小的不准确之处。 例如:

a = 45310630.0
b = 1023473145

c = int(a * b)
print(c)

我得到的答案是 46374212988031352 但我知道答案应该是 46374212988031350。当我将变量 "a" 更改为整数时,乘法正确执行。但是,由于 "a" 来自除法(可能不是整数),我不能简单地将它转换为整数。

如果您使用 fractions.Fraction,您可以准确地处理更大的数字,但会降低一些效率:

from fractions import Fraction
a = Fraction(45310630.0)
b = Fraction(1023473145)

c = int(a * b)
print(c)

输出:

46374212988031350

一些时间:

In [2]: a = Fraction(45310630.0)
   ...: b = Fraction(1023473145)
   ...:

In [3]: %timeit int(a * b)
3.92 µs ± 21.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [4]: a = 45310630.0
   ...: b = 1023473145
   ...:

In [5]: %timeit int(a * b)
479 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

c不正确的原因是due to how Python and other languages perform floating point math

要避免此问题,您可以使用标准库中包含的 fractiondecimal 模块:

>>> a = 45310630.0
>>> b = 1023473145
>>> expected = 46374212988031350
>>> int(a * b) == expected
False

>>> from decimal import Decimal
>>> dec_a = Decimal.from_float(a)
>>> dec_b = Decimal.from_float(b)
>>> int(dec_a * dec_b) == expected
True

>>> from fraction import Fraction
>>> frac_a = Fraction.from_float(a)
>>> frac_b = Fraction.from_float(b)
>>> int(frac_a * frac_b) == expected
True