Java: Double Value Comparison

后端 未结 7 2115
日久生厌
日久生厌 2020-12-01 12:33

Do we need to be careful when comparing a double value against zero?

if ( someAmount <= 0){
.....
}
7条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-01 12:59

    Yes you should be careful.

    Suggestion : One of the good way would be using BigDecimal for checking equality/non-equality to 0:

    BigDecimal balance = pojo.getBalance();//get your BigDecimal obj
    
    0 != balance.compareTo(BigDecimal.ZERO)
    

    Explanation :

    The compareTo() function compares this BigDecimal with the specified BigDecimal. Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method. This method is provided in preference to individual methods for each of the six boolean comparison operators (<, ==, >, >=, !=, <=). The suggested idiom for performing these comparisons is: (x.compareTo(y) 0), where is one of the six comparison operators.

    (Thanks to SonarQube documentation)

    Floating point math is imprecise because of the challenges of storing such values in a binary representation. Even worse, floating point math is not associative; push a float or a double through a series of simple mathematical operations and the answer will be different based on the order of those operation because of the rounding that takes place at each step.

    Even simple floating point assignments are not simple:

    float f = 0.1; // 0.100000001490116119384765625
    double d = 0.1; // 0.1000000000000000055511151231257827021181583404541015625
    

    (Results will vary based on compiler and compiler settings);

    Therefore, the use of the equality (==) and inequality (!=) operators on float or double values is almost always an error. Instead the best course is to avoid floating point comparisons altogether. When that is not possible, you should consider using one of Java's float-handling Numbers such as BigDecimal which can properly handle floating point comparisons. A third option is to look not for equality but for whether the value is close enough. I.e. compare the absolute value of the difference between the stored value and the expected value against a margin of acceptable error. Note that this does not cover all cases (NaN and Infinity for instance).

提交回复
热议问题