Floating-Point Equality Comparison

ID

java.float_equality_comparison

Severity

low

Remediation Complexity

trivial

Remediation Risk

low

Remediation Effort

low

Resource

Reliability

Language

Java

Tags

CWE:1025, reliability, suspicious-comparison

Description

Reports use of == or != to compare float or double values.

Rationale

Due to IEEE 754 rounding, two floating-point computations that are mathematically equal may differ by a tiny epsilon. Direct equality comparison is therefore almost always wrong and can cause intermittent bugs that are difficult to reproduce.

// Bad - floating-point equality is unreliable
if (total == 0.3) {
    applyDiscount();
}

Remediation

Compare using an epsilon tolerance, or use Double.compare() / Float.compare():

// Good - epsilon comparison
if (Math.abs(total - 0.3) < 1e-9) {
    applyDiscount();
}

// Good - use Double.compare
if (Double.compare(a, b) == 0) {
    // ...
}