-1

这是表达式:

if( Math.abs(GH1[i]) < Double.valueOf("1E-100") ){
.
.
.
}  

所有变量都是double类型。从代码中应该清楚我要比较的内容。我一直认为这在 java 中是正确的,因为编译器也从不显示任何错误。但我最近在这里读到,我不应该用它==来比较浮点数。其他关系运算符也是如此吗?如果我不担心NaN,我可以只使用内置的关系运算符而不是DoubleorFloat函数吗?

我可以使用如下所示的表达式吗?

if(GH1[i] < 0.0f)           // if( Double.compare(GH1[i], 0.0f) < 0  )
    tempSign = -1.0f;
else if(GH1[i] == 0.0f)     // else if( Double.compare(GH1[i], 0.0f) == 0 )
    tempSign = 0.0f;
else if(GH1[i] > 0.0f)      // else if( Double.compare(GH1[i], 0.0f) > 0 )
    tempSign = 1.0f;

还是必须使用 Double 和 Float 的函数?

4

3 回答 3

0

它有效吗?是的。它将编译并运行。但是,正如您在该问题中所读到的,当您开始比较非常接近的数字时,您可能会遇到舍入误差,并且舍入误差有时可能有点不可预测。这会导致完全相等的大问题(如您所读),但当您开始比较非常接近的浮点数时也会导致问题(尽管可能性较小)。

于 2013-10-08T04:37:12.480 回答
0

如您链接的问答中所述,由于具有双 NaN 的边缘情况等,最好使用double.Compare()

于 2013-10-08T04:45:02.903 回答
0

关系运算符通常可以安全使用。问题==在于非常小的舍入误差会导致人们可能认为相等的数字测试不相等。当你确实想要一个平等测试时,最好使用类似的东西:

if (Math.abs(a - b) < TOLERANCE) { . . . }

TOLERANCE您要忽略的舍入误差量在哪里。(例如,您也可以使用相对TOLERANCE * a数量。

您可以使用Double.compare并测试它是正数、负数还是 0,但这通常是不必要的,而且在许多情况下可能是错误的。例如Double.compare(Double.NaN, Double.NaN),当您通常希望将NaN其视为不等于任何事物(包括其自身)时,将返回 0(表示相等)。正负无穷也是如此。

于 2013-10-08T04:55:18.027 回答