如何以正确的方式比较整数和浮点值?
内置比较运算符在某些情况下会给出错误的结果,例如:
#include <iomanip>
#include <iostream>
int main()
{
long long a = 999999984306749439;
float b = 999999984306749440.f; // This number can be represented exactly by a `float`.
std::cout << std::setprecision(1000);
std::cout << a << " < " << b << " = " << (a < b) << '\n';
// Prints `999999984306749439 < 999999984306749440 = 0`, but it should be `1`.
}
Run Code Online (Sandbox Code Playgroud)
显然,比较运算符在实际比较它们之前将两个操作数都转换为相同类型。在这里,lhs转换为float,这会导致精度损失,并导致错误的结果。
即使我了解发生了什么,也不确定如何解决此问题。
免责声明:该示例使用float和long long,但我正在寻找一种通用解决方案,该解决方案适用于整数类型和浮点类型的每种组合。