安卓这是一个有效的java表达式吗?
这是一个表达:
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的函数
# 1 楼答案
有效吗?对它将编译并运行。然而,正如你在那个问题中读到的,当你开始比较非常接近的数字时,你可能会遇到舍入误差,舍入误差有时可能有点不可预测。这会导致精确相等的大问题(正如你所读到的),但当你开始比较非常接近的浮动时也会导致问题(尽管可能性较小)
# 2 楼答案
关系运算符通常可以安全使用。
==
的问题是,非常小的舍入误差将导致人们可能认为是相等的数字,而在测试中则是不相等的。当你确实想要一个平等测试时,最好使用以下方法:其中)
TOLERANCE
是要忽略的舍入误差量。(例如,您也可以使用相对量-^{你可以使用
Double.compare
测试它是阳性、阴性还是0,但这通常是不必要的,在许多情况下,可能是错误的。例如,Double.compare(Double.NaN, Double.NaN)
将返回0(表示相等),而您通常希望将NaN
视为不等于任何东西(包括它本身)。正无穷大和负无穷大也是如此# 3 楼答案
如问题和建议中所述;由于带有双NaN等的边缘情况,最好使用
double.Compare()