Подтвердить что ты не робот

Почему anyValue% 1 "глупая математика" в Sonar, когда anyValue является двойным?

SonarQube вызывает серьезное нарушение В моем коде не должно выполняться глухая математика. В описании говорится

Некоторые математические операции просто глупы и не должны выполняться потому что их результаты предсказуемы.

В частности, anyValue% 1 глупо, потому что он всегда будет возвращать 0.

В моем случае, однако, anyValue является двойным. И для меня это работает . Вот фактический код:

double v = Double.parseDouble(Utils.formatDouble(Double.valueOf(value.getValue()), accuracy.intValue()));
boolean negative = v < 0;
v = Math.abs(v);
long deg = (long) Math.floor(v);

v = (v % 1) * 60;

Является ли анализатор, предполагающий, что моя переменная является int (что является их ошибкой)? Или я пропущу что-то еще?

4b9b3361

Ответ 1

Это действительно ошибка, поэтому большое спасибо за сообщение об этом.

Проблема здесь в коде: https://github.com/SonarSource/sonar-java/blob/3.9/java-checks/src/main/java/org/sonar/java/checks/ConstantMathCheck.java#L117

где нет абсолютно никакой проверки типа левого операнда оператора%.

Я только что подал следующую ошибку: https://jira.sonarsource.com/browse/SONARJAVA-1457

Ответ 2

Вы можете сделать свое выражение более явным, изменив его, чтобы использовать явную двойную константу, например:

(v % 1.0d) * 60