Why is this an issue?
Some mathematical operations are unnecessary and should not be performed because their results are predictable.
For instance, anyValue % 1
will always return 0, as any integer value can be divided by 1 without remainder.
Similarly, casting a non-floating-point to a floating-point value and then passing it to Math.round
, Math.ceil
, or
Math.floor
is also unnecessary, as the result will always be the original value.
The following operations are unnecessary when given any constant value: Math.abs
, Math.ceil
, Math.floor
,
Math.rint
, Math.round
. Instead, use the result of the operation directly.
The following operations are unnecessary with certain constants and can be replaced by the result of the operation directly:
Operation |
Value |
acos |
0.0 or 1.0 |
asin |
0.0 or 1.0 |
atan |
0.0 or 1.0 |
atan2 |
0.0 |
cbrt |
0.0 or 1.0 |
cos |
0.0 |
cosh |
0.0 |
exp |
0.0 or 1.0 |
expm1 |
0.0 |
log |
0.0 or 1.0 |
log10 |
0.0 or 1.0 |
sin |
0.0 |
sinh |
0.0 |
sqrt |
0.0 or 1.0 |
tan |
0.0 |
tanh |
0.0 |
toDegrees |
0.0 or 1.0 |
toRadians |
0.0 |
How to fix it
Ask yourself if the questionable operation represents the desired calculation or if a value used is erroneous. If the calculation is correct,
replace it with the result to avoid having to perform the unnecessary operation at runtime.
Code examples
Noncompliant code example
public void doMath(int a) {
double res1 = Math.floor((double)a); // Noncompliant, the result will always be equal to '(double) a'
double res2 = Math.ceil(4.2); // Noncompliant, the result will always be 5.0
double res3 = Math.atan(0.0); // Noncompliant, the result will always be 0.0
}
Compliant solution
public void doMath(int a) {
double res1 = a; // Compliant
double res2 = 5.0; // Compliant
double res3 = 0.0; // Compliant
}