比较不适用于<=运算符

Luc*_*ems -1 c++ floating-point c++11

我有以下C++代码:

float test(0.2);
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
Run Code Online (Sandbox Code Playgroud)

而这个输出:

2 false
Run Code Online (Sandbox Code Playgroud)

但问题是我应该有这个输出:

2 true
Run Code Online (Sandbox Code Playgroud)

我该如何纠正这个问题?

Mik*_*our 7

错误在哪里?

这是一个舍入错误.在二进制浮点格式中既1.8不能也不能0.2完全表示,因此使用的实际值略有不同.这意味着最终结果可能不完全是2; 但cout将其流式传输将会将其四舍五入并打印出来2.

您可以通过更精确地打印它来自己看到:

cout << setprecision(20) << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;

// Output: 2.0000000029802320611 false
Run Code Online (Sandbox Code Playgroud)

实例

我该如何纠正这个问题?

这取决于你正在尝试用浮点数做什么.通常,您可以简单地允许对误差的小容差,例如

float tolerance = 1e-6;
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2 + tolerance) << endl;
Run Code Online (Sandbox Code Playgroud)

但是,一般来说,管理错误和计算可接受的容差可能是一种黑暗的艺术,需要很好地理解算法的细节.