0.1 + 0.2 == 0.3 ==> False
我在 python、c#、c++、F#、Visual Basic.NET、ASP.NET 中试过这个!
0.1 + 0.2 == 0.30000000000000004 ==> True
这适用于我上面提到的所有语言。为什么会发生这种不合逻辑的不平等?
Python 有一个十进制库,可以让你将它评估为真(同时也解释了为什么它是假的),事实上,它们使用几乎相同的例子:http ://docs.python.org/ 2/库/decimal.html
精确性延续到算术上。在十进制浮点中,0.1 + 0.1 + 0.1 - 0.3 正好等于零
还与“每个计算机科学家应该了解的浮点知识”相关,这是一篇多年前写的开创性文章,今天仍然正确:http ://www.fer.unizg.hr/_download/repository/paper%5B1%5D.pdf
您可能想阅读一下: http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html(每个计算机科学家都应该知道的关于浮点运算的知识)
简短的回答是,在二进制中,0.1 是一个重复分数,它在 1/8 和 1/16 之间的“某处”,因此没有 0.1(或 0.2)的“位精确”表示。在比较浮点值时,您始终必须在 epsilon 值内这样做,以防止此类问题。
从 Python 文档中阅读此内容;它几乎一字不差地适用于所有语言:
要比较浮点数,请使用以下模式:
Math.Abs(NumberToCompare1 - NumberToCompare2) < 0.01
其中 0.01 是 Epsilon,即运算的精度。