org.sonar.l10n.java.rules.java.S2164.html Maven / Gradle / Ivy
Why is this an issue?
For small numbers, float
math has enough precision to yield the expected value, but for larger numbers, it does not.
BigDecimal
is the best alternative, but if a primitive is required, use a double
.
Noncompliant code example
float a = 16777216.0f;
float b = 1.0f;
float c = a + b; // Noncompliant; yields 1.6777216E7 not 1.6777217E7
double d = a + b; // Noncompliant; addition is still between 2 floats
Compliant solution
float a = 16777216.0f;
float b = 1.0f;
BigDecimal c = BigDecimal.valueOf(a).add(BigDecimal.valueOf(b));
double d = (double)a + (double)b;
Exceptions
This rule doesn’t raise an issue when the mathematical expression is only used to build a string.
System.out.println("["+getName()+"] " +
"\n\tMax time to retrieve connection:"+(max/1000f/1000f)+" ms.");
Resources
- CERT, FLP02-C. - Avoid using floating-point numbers when precise computation is
needed
© 2015 - 2024 Weber Informatics LLC | Privacy Policy