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
}