有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这是一个表达:

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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    关系运算符通常可以安全使用。==的问题是,非常小的舍入误差将导致人们可能认为是相等的数字,而在测试中则是不相等的。当你确实想要一个平等测试时,最好使用以下方法:

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

    其中TOLERANCE是要忽略的舍入误差量。(例如,您也可以使用相对量-^{

    你可以使用Double.compare测试它是阳性、阴性还是0,但这通常是不必要的,在许多情况下,可能是错误的。例如,Double.compare(Double.NaN, Double.NaN)将返回0(表示相等),而您通常希望将NaN视为不等于任何东西(包括它本身)。正无穷大和负无穷大也是如此

  3. # 3 楼答案

    如问题和建议中所述;由于带有双NaN等的边缘情况,最好使用double.Compare()