getcontext().prec 没有按预期工作

getcontext().prec not working as expected

from decimal import *

getcontext().prec = 8
print(getcontext(),"\n")

x_amount = Decimal(0.025)
y_amount = Decimal(0.005)

test3 = x_amount - y_amount

print("test3",test3)

输出:

Context(prec=8, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) 


test3 0.020000000
 

如果根据提到的示例 here,如果将精度设置为 8,为什么 'test3' 的 return 值最多保留 9 位小数?

如果我将上面代码中的第 6 行和第 7 行替换为:

,它会更改为小数点后 3 位
x_amount = Decimal('0.025')
y_amount = Decimal('0.005')

我在财务应用程序中使用小数,发现它在转换、运算、定义、精度等方面非常混乱。有没有 link 可以参考,了解在 [= 中使用小数的详细信息25=]?

你的结果是正确的。 prec 表示从最重要的 non-zero 位 开始要保留多少位 。所以在你的结果中:

test3 0.020000000
         ^^^^^^^^

插入符号指向的数字是精度涵盖的预期八位数字。你得到所有这些的原因是使用 float 初始化 Decimal 总是错误的。永远不要从 float 初始化 Decimal;它只是在 Decimal 中重现了 float 的不准确性(尝试 printing x_valuey_value 以查看垃圾)。传递 str 是唯一安全的方法。

当您使用 str 执行此操作时,个人 Decimal 会“知道”他们拥有的有意义精度的最后一位,并且它只会到达小数点后第三位,因此结果不会'包括超出该点的精度。如果您希望启动 prec 上限,请尝试以比 prec 更精确的方式初始化其中一个参数,结果将四舍五入为 prec.