这是表达式:
if( Math.abs(GH1[i]) < Double.valueOf("1E-100") ){
.
.
.
}
所有变量均为double
类型。从代码中可以清楚地看到我要比较的内容。我总是认为这在java中是正确的,因为编译器也从不显示任何错误。 But I recently read here我不应该使用==
来比较浮点数。是否适用于其他关系运营商?如果我不担心NaN
,我可以使用内置的关系运算符代替Double
或Float
函数吗?
我可以使用下面显示的表达式吗?
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的功能吗?
答案 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(表示相等)。加号和减号无限相同。