我试图在Python中用非常大的整数乘以非常大的浮点数,并注意到小的不准确性。 例如:
a = 45310630.0
b = 1023473145
c = int(a * b)
print(c)
我得到的答案是 46374212988031352但我知道答案应该是46374212988031350.当我将变量“a”更改为整数时,正确执行乘法。但是,由于“a”来自一个分区(可能不是一个整数),我不能简单地将它转换为整数。
答案 0 :(得分:4)
如果你使用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)
答案 1 :(得分:2)
c
不正确的原因是due to how Python and other languages perform floating point math。
要解决此问题,您可以使用标准库中包含的fraction
和decimal
模块:
>>> 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