python 中非常大的数字的舍入误差
Rounding errors for very large numbers in python
四舍五入带有很多小数点的非常大的数字会产生错误。这种类型的小数舍入有什么限制?我是 Python 的初学者,所以我不确定是否有其他解决方法。
from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+12345678912345678912345678), 2))
输出:
12345678912345678704279552.00
注意整数上的额外数字:
from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+123456789123456789123456789), 2))
输出:
Traceback (most recent call last):
File "", line 1, in
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
与常见的误解相反,decimal
模块不执行精确的算术运算。它执行可调精度、十进制、浮点运算。
decimal
模块默认为 28 位小数精度。您请求的舍入操作至少需要 29 位精度,而不是默默地给您较低的精度,decimal
会为此特定操作抛出错误。
当然,您想要执行的操作涉及的精度远高于 29 位数字的精度,但是因为您在 float
算术而不是 decimal
算术,你甚至在 decimal
参与之前就失去了大部分精度。 float
的精度略低于 16 位小数。在 Decimal
调用中包装 float
计算不会在 Decimal
算术中进行数学计算;你需要 start with Decimal
:
import decimal
decimal.getcontext().prec = 100 # enough
print(round(decimal.Decimal('0.123456789123456789123456789123456789123')+
decimal.Decimal('123456789123456789123456789'), 2))
四舍五入带有很多小数点的非常大的数字会产生错误。这种类型的小数舍入有什么限制?我是 Python 的初学者,所以我不确定是否有其他解决方法。
from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+12345678912345678912345678), 2))
输出:
12345678912345678704279552.00
注意整数上的额外数字:
from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+123456789123456789123456789), 2))
输出:
Traceback (most recent call last):
File "", line 1, in
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
与常见的误解相反,decimal
模块不执行精确的算术运算。它执行可调精度、十进制、浮点运算。
decimal
模块默认为 28 位小数精度。您请求的舍入操作至少需要 29 位精度,而不是默默地给您较低的精度,decimal
会为此特定操作抛出错误。
当然,您想要执行的操作涉及的精度远高于 29 位数字的精度,但是因为您在 float
算术而不是 decimal
算术,你甚至在 decimal
参与之前就失去了大部分精度。 float
的精度略低于 16 位小数。在 Decimal
调用中包装 float
计算不会在 Decimal
算术中进行数学计算;你需要 start with Decimal
:
import decimal
decimal.getcontext().prec = 100 # enough
print(round(decimal.Decimal('0.123456789123456789123456789123456789123')+
decimal.Decimal('123456789123456789123456789'), 2))