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

在Python中精确地乘以非常大的数字,python,overflow,largenumber,Python,Overflow,Largenumber,在Python中,我试图用非常大的整数乘以非常大的浮点数,我注意到了一些小的错误。 例如: a = 45310630.0 b = 1023473145 c = int(a * b) print(c) 我得到的答案是 46374212988031352但我知道答案应该是46374212988031350。当我将变量“a”更改为整数时,乘法的执行是正确的。但是,由于“a”来自除法(可能不是整数),我不能简单地将其转换为整数。如果使用,您可以准确地处理较大的数字,但会牺牲一些效率: from fr

在Python中,我试图用非常大的整数乘以非常大的浮点数,我注意到了一些小的错误。 例如:

a = 45310630.0
b = 1023473145

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

如果使用,您可以准确地处理较大的数字,但会牺牲一些效率:

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)
如果使用,您可以准确地处理较大的数字,但会牺牲一些效率:

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
不正确的原因是

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

>a=45310630.0
>>>b=1023473145
>>>预期=46374212988031350
>>>int(a*b)=预期值
假的
>>>从十进制输入十进制
>>>dec_a=十进制。从浮点数(a)
>>>dec_b=十进制。从浮点数(b)
>>>int(dec_a*dec_b)=预期值
真的
>>>从分数导入分数
>>>frac_a=来自浮点数(a)的分数
>>>frac_b=来自浮点数(b)的分数
>>>int(分形a*分形b)=预期值
真的

导致
c
不正确的原因是

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

>a=45310630.0
>>>b=1023473145
>>>预期=46374212988031350
>>>int(a*b)=预期值
假的
>>>从十进制输入十进制
>>>dec_a=十进制。从浮点数(a)
>>>dec_b=十进制。从浮点数(b)
>>>int(dec_a*dec_b)=预期值
真的
>>>从分数导入分数
>>>frac_a=来自浮点数(a)的分数
>>>frac_b=来自浮点数(b)的分数
>>>int(分形a*分形b)=预期值
真的

请注意,为了获得准确的结果,不应将浮点数转换为分数。文档对此提出警告,并给出了浮点数1.1未按预期转化为分数11/10的示例。请注意,要获得准确的结果,不应将浮点数转化为分数。文档对此提出了警告,并给出了一个例子,即float 1.1没有按预期变成分数11/10。