Анализатор обнаружил переменную вещественного типа в качестве счётчика цикла 'for'. Поскольку числа с плавающей точкой не могут точно отобразить все действительные числа, использование таких переменных в цикле может привести к неожиданным результатам, таким как лишние итерации.
Рассмотрим подробнее:
for (double i = 0.0; i < 1.0; i += 0.1) {
....
}
Количество итераций в этом цикле будет равно 11 вместо ожидаемых 10. При выполнении кода без модификатора 'strictfp' в версиях Java ниже 17-ой результат операций с плавающей точкой может также зависеть от платформы. Чтобы избежать возможных проблем, следует использовать целочисленный тип для счётчика, а вычисления производить внутри:
for (var i = 0; i < 10; i++) {
double counter = i / 10.0;
....
}
Дополнительной причиной не использовать действительный тип может быть опасность бесконечного цикла. В качестве примера — следующий фрагмент:
for (float i = 100000000.0f; i <= 100000009.0f; i += 0.5f) {
....
}
Он возникает из-за слишком маленького инкремента относительно количества значащих цифр. Для предотвращения такой ситуации лучше также использовать целочисленный тип счётчика, а во избежание потери точности использовать 'double' для хранения значения:
for (var i = 0; i < 19; i++) {
double value = 100000000.0d + i / 2d;
....
}
Данная диагностика классифицируется как:
|