python中非常大的数字的舍入错误

nmp*_*ira 2 python decimal rounding python-3.x

用大量小数舍入大数字会产生错误。这种小数舍入的限制是什么?我是 Python 的初学者,所以我不确定是否还有其他方法可以解决这个问题。

from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+12345678912345678912345678), 2))
Run Code Online (Sandbox Code Playgroud)

输出:

12345678912345678704279552.00

注意 int 上的额外数字:

from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+123456789123456789123456789), 2))
Run Code Online (Sandbox Code Playgroud)

输出:

回溯(最近一次调用):
文件“”,第 1 行,
十进制。InvalidOperation:[<class 'decimal.InvalidOperation'>]

use*_*ica 5

与常见的误解相反,该decimal模块不执行精确的算术运算。它执行可调精度、十进制、浮点运算。

所述decimal模块默认为28十进制数的精度。您请求的舍入运算至少需要 29 位精度,而不是默默地降低精度,decimal为此特定运算引发错误。

当然,您想要执行的运算涉及的精度远高于 29 位精度,但是因为您用float算术而不是decimal算术进行了一半的数学运算,所以您decimal甚至在参与之前就已经失去了大部分精度。float精度略低于 16 位十进制数字。floatDecimal调用中包装计算不会进行Decimal算术运算;你需要开始使用Decimal

import decimal
decimal.getcontext().prec = 100 # enough
print(round(decimal.Decimal('0.123456789123456789123456789123456789123')+
            decimal.Decimal('123456789123456789123456789'), 2))
Run Code Online (Sandbox Code Playgroud)