Анализатор обнаружил переменную вещественного типа в качестве счётчика цикла '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; .... }
Данная диагностика классифицируется как:
|