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') 
+0

嘿,谢谢,很高兴知道Decimal喜欢的字符串,我根据你的回答编辑了一些问题,尽管 – SomeGuy30145

尝试指定的数字作为字符串

>>> Decimal('0.10') * Decimal('0.10') - Decimal('0.0100') 
>>> Decimal('0.000') 
+0

嗨,谢谢,很高兴知道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中精确表示,所以不会有舍入误差。