这是一个有效的java表达式吗?

时间:2013-10-08 04:33:51

标签: java android

这是表达式:

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

所有变量均为double类型。从代码中可以清楚地看到我要比较的内容。我总是认为这在java中是正确的,因为编译器也从不显示任何错误。 But I recently read here我不应该使用==来比较浮点数。是否适用于其他关系运营商?如果我不担心NaN,我可以使用内置的关系运算符代替DoubleFloat函数吗?

我可以使用下面显示的表达式吗?

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的功能吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

其中TOLERANCE是您要忽略的舍入错误量。 (例如,您也可以使用相对金额 - TOLERANCE * a

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