我想知道将浮点数与小数点后三位进行比较的最快方法是什么。说我有这样的事情
float lhs = 2.567xxxx
float rhs = 2.566xxxx
以上应该是不同的,如果它是这样的
float lhs = 2.566xxxx
float rhs = 2.566xxxx
他们应该是一样的
更新:
我正在尝试以下
double trunc(double d)
{
return (d>0) ? floor(d) : ceil(d) ;
}
bool comparedigits(float a , float b)
{
if (trunc(1000.0 * a) == trunc(1000.0 * b))
{
return true;
}
return false;
}
float g = 2.346;
float h= 2.34599;
bool t = comparedigits(g,h) ; //Not the same and should return false;
然而,它正在返回true。
最佳答案
为了阻止错误答案的冲击,因为它们允许舍入来改变结果,这里有一个没有舍入问题的答案,因为它使用 double
进行算术:
trunc(1000. * lhs) == trunc(1000. * rhs);
这是有效的,因为
1000.
的类型为 double
,所以另一个操作数从 float
转换为 double
,并以 double
格式执行乘法。 1000 与任何 float
值的乘积可以在 double
中精确表示,因此没有舍入误差(假设 IEEE 754 32 位和 64 位二进制浮点)。然后我们使用 trunc
来比较直到小数点后(原始)第三位的数字。我犹豫要不要提供这个答案,因为我不确定这是 OP 真正想要的。通常,当人们来到 Stack Overflow 并要求比较“小数点后三位”时,他们并没有完全考虑问题。一个完整的正确答案可能要等到我们澄清。
此外,以上仅适用于正数。如果值可能为负,则应对其符号进行预先测试,如果它们不同,则应返回
false
。 (否则,–.0009 将被报告为等于 +.0009。)关于c++ - 比较浮点数到小数点后三位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18686269/