这不是Matlab问题;这是一个浮点问题。在 C++(或任何符合以下标准的编程语言)中,您将得到相同的结果IEEE754 http://en.wikipedia.org/wiki/Double-precision_floating-point_format对于这个问题):
#include <iostream>
int main(int, char **) {
std::cout << (1.1-0.2==0.9) << std::endl;
return 0;
}
output:
0
这是因为 1.1 和 0.9无法用二进制精确表示 http://en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary。这就像用十进制表示 1/3:你必须写
0.33333333333333333333333333333333333333333333333...
并无限期地继续下去。但无论你继续多久,你都永远不会做对。
在浮点中,您只能存储有限的数字,因此计算必须在某个地方停止。计算的结果实际上是
>> 1.1-0.2
ans =
9.000000000000001e-01
这非常接近,但不太正确。
因此,在使用之前您应该三思而后行==
比较两个浮点数;很少见的是==
可以应用运算符,而不会出现像您刚刚遇到的那样的“奇怪”后果。
最好使用舍入特定公差,例如
abs(1.1-0.2 - 0.9) <= eps(0.9)
where eps
是一个 Matlab 函数,它返回双打之间的间距 http://en.wikipedia.org/wiki/Double-precision_floating-point_format对于特定的双精度值。但实际上,这并不是一个包罗万象的解决方案。正确比较浮点数是一件棘手的事情。