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
的不准确性(尝试 print
ing x_value
和 y_value
以查看垃圾)。传递 str
是唯一安全的方法。
当您使用 str
执行此操作时,个人 Decimal
会“知道”他们拥有的有意义精度的最后一位,并且它只会到达小数点后第三位,因此结果不会'包括超出该点的精度。如果您希望启动 prec
上限,请尝试以比 prec
更精确的方式初始化其中一个参数,结果将四舍五入为 prec
.
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
的不准确性(尝试 print
ing x_value
和 y_value
以查看垃圾)。传递 str
是唯一安全的方法。
当您使用 str
执行此操作时,个人 Decimal
会“知道”他们拥有的有意义精度的最后一位,并且它只会到达小数点后第三位,因此结果不会'包括超出该点的精度。如果您希望启动 prec
上限,请尝试以比 prec
更精确的方式初始化其中一个参数,结果将四舍五入为 prec
.