我对这种减法和求和如何以这种方式工作感到有些困惑:
A = 5
B = 0.1
C = A+B-A
我发现答案是 0.099999999999999645。为什么答案不是 0.1?
我对这种减法和求和如何以这种方式工作感到有些困惑:
A = 5
B = 0.1
C = A+B-A
我发现答案是 0.099999999999999645。为什么答案不是 0.1?
这是一个浮点舍入误差。Python 网站上有一个关于浮点数的非常好的教程,解释了这是什么以及为什么会发生。
如果你想要一个准确的结果,你可以:
格式化您的结果以显示一组小数位数(这不能解决舍入错误):
print "%.2f"%C
我还建议阅读 Brian 的回答中的“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。
您会看到浮点运算的人工制品,它没有无限精度。有关FP 数学如何工作以及为什么会出现舍入错误的完整描述,请参阅这篇文章。
这是因为所谓的 epsilon 值。这意味着从x
到x+E
每个浮点数都被认为等于x
。你可以在 python 的这个问答中读到一些关于这个值的东西
这个 epsilon 值(E
)取决于数字的大小,你总是可以从numpy.spacing(x)
计算机使用“二进制数”来存储信息。整数可以精确存储,但小数通常存储为“浮点数”。
有些数字很容易以 10 为基数编写,但无法以二进制浮点格式精确表示,而 0.1 就是其中之一。
可以准确地存储数字,并准确地使用这些数字。例如,数字 0.1 可以存储为1 / 10
,换句话说,存储为分子 (1) 和分母 (10),要理解分子除以分母。然后一个正确编写的数学库可以处理这些分数并为你做数学。但它比仅仅使用浮点数要慢得多,所以它并不经常使用。(而且我认为在银行业务中,他们通常只使用整数而不是浮点来存储货币;1.23 美元可以存储为数字 123,隐含两位小数。在处理货币时,浮点数不够精确! )