Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中非常大的数字的舍入错误_Python_Python 3.x_Decimal_Rounding - Fatal编程技术网

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

python中非常大的数字的舍入错误,python,python-3.x,decimal,rounding,Python,Python 3.x,Decimal,Rounding,用大量小数舍入非常大的数字会产生错误。这种小数四舍五入的限制是什么?我是Python的初学者,所以我不确定是否有其他方法可以解决这个问题 from decimal import * print(round(Decimal((0.123456789123456789123456789123456789123)+12345678912345678912345678), 2)) 输出: 1234567892345678704279552.00 注意int上的额外数字: from decimal im

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

from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+12345678912345678912345678), 2))
输出:

1234567892345678704279552.00

注意int上的额外数字:

from decimal import *
print(round(Decimal((0.123456789123456789123456789123456789123)+123456789123456789123456789), 2))
输出:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
decimal.invalidooperation:[]


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

decimal
模块默认为28位小数精度。您请求的舍入操作至少需要29位精度,而不是默默地降低精度,
decimal
会为此特定操作抛出一个错误

当然,您想要执行的操作的精度远高于29位,但由于您在
浮点
算术中完成了一半的数学运算,而不是
十进制
算术,因此在
十进制
甚至可以参与之前,您就失去了大部分精度
float
的精度略低于16位小数。在
Decimal
调用中包装
float
计算将无法完成
Decimal
算术中的数学运算;您需要从十进制开始:

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

谢谢,这解决了我的问题。事实上,我发现了另一个类似的线程。将留给未来的搜索者。它提供了一些额外的信息。