Details

    • Type: Language-Specification
    • Status: Active
    • Resolution: Unresolved
    • Labels:
      None
    • Message:
      Replace this equality test with "Double/Float.isNaN(...)".
    • Highlighting:
      Hide

      equality

      Show
      equality
    • Default Severity:
      Major
    • Impact:
      Low
    • Likelihood:
      High
    • Remediation Function:
      Constant/Issue
    • Constant Cost:
      5min

      Description

      When working with float or double primitive types, it may be required to deal with NaN (Not a Number) values. When tested against itself, NaN will always answer false as long as the primitive wrapper type is not used. When the wrapper is used, it will always be true. This property is illustrated in the code snipped below.

      double d = getValue();
      if (d == d) { // false for primitive 'double' when NaN, and true for any non-NaN values
        doSomething();
      }
      
      Double bigD = getValue();
      if (bigD == bigD) { // always true for wrapper type 'Double' when NaN, AND with any other Double value
        doSomething(); 
      }
      

      In order to remove any ambiguity, this rule raises an issue every time an equality test is used with double, Double, float or Float, when both sides of the test are the same variable. The isNaN(...) methods from Double and Float should be preferred.

      Noncompliant Code Example

      double x = getValue();
      if (x == x) { // Noncompliant
        doSomething();
      }
      if (x == Double.NaN) { // Noncompliant
        doSomething();
      }
      

      Compliant Solution

      double x = getValue();
      if (Double.isNaN(x)) { // compliant
        doSomething();
      }
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                michael.gumowski Michael Gumowski
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated: