rspec/rules/S2688/java/rule.adoc

39 lines
1.2 KiB
Plaintext
Raw Normal View History

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.
2020-06-30 12:48:07 +02:00
----
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.
2020-06-30 12:48:07 +02:00
== 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();
}
----
include::../see.adoc[]