Python十进制模块 - 不想要的类浮点输出?
这我想象的非常简单 - 但为什么在下面是y
的两个值不是== 0?我认为十进制模块的全部要点是摆脱浮尘......以下是将数字作为变量传递的数学例程的极简化版本。Python十进制模块 - 不想要的类浮点输出?
from decimal import *
getcontext().prec = 2
q = Decimal(0.01)
x = Decimal(0.10) * Decimal(0.10)
y = Decimal(x) - Decimal(q)
print(x,y, Decimal(y))
'''
x== 0.010
y== -2.1E-19
Decimal(y) == -2.1E-19
'''
的float
字面0.10
是不准确的数学数0.10
,用它来初始化Decimal
不避float
精度问题。
相反,使用字符串初始化Decimal
可以给你预期的结果:
x = Decimal('0.10') * Decimal('0.10')
y = Decimal(x) - Decimal('0.010')
尝试指定的数字作为字符串
>>> Decimal('0.10') * Decimal('0.10') - Decimal('0.0100')
>>> Decimal('0.000')
嗨,谢谢,很高兴知道Decimal喜欢的字符串,但是我根据你的回答编辑了一些问题,尽管 – SomeGuy30145
这是在现有的答案提出的观点的更详细的解释。
如果您需要精确的十进制算术,您确实需要摆脱数字文字,如0.1
。数字文字通常由IEEE 754 64位二进制浮点数表示。
与0.1最接近的这种数字是0.1000000000000000055511151231257827021181583404541015625。它的平方是0.01000000000000000111022302462515657123851077828659396139564708135883709660962637144621112383902072906494140625,这与0.01最接近,0.010000000000000020816681711721685132943093776702880859375不一样。
你可以得到什么回事通过移除prec =2
情况下,允许更多精确的输出更清晰的视野:
from decimal import *
q = Decimal(0.01)
x = Decimal(0.10) * Decimal(0.10)
y = Decimal(x) - Decimal(q)
print(q)
print(x)
print(y)
输出:
0.01000000000000000020816681711721685132943093776702880859375
0.01000000000000000111022302463
9.020562075127831486705690622E-19
如果你曾经使用字符串常量,如由其他响应建议,转换为Decimal将直接完成,而不需要经过二进制浮点。 0.1和0.01都可以在Decimal中精确表示,所以不会有舍入误差。
嘿,谢谢,很高兴知道Decimal喜欢的字符串,我根据你的回答编辑了一些问题,尽管 – SomeGuy30145