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'>]
与常见的误解相反,该decimal
模块不执行精确的算术运算。它执行可调精度、十进制、浮点运算。
所述decimal
模块默认为28十进制数的精度。您请求的舍入运算至少需要 29 位精度,而不是默默地降低精度,decimal
为此特定运算引发错误。
当然,您想要执行的运算涉及的精度远高于 29 位精度,但是因为您用float
算术而不是decimal
算术进行了一半的数学运算,所以您decimal
甚至在参与之前就已经失去了大部分精度。float
精度略低于 16 位十进制数字。float
在Decimal
调用中包装计算不会进行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)