>
>
>
V6108. Do not use real-type variables i…


V6108. Do not use real-type variables in 'for' loop counters.

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

Данная диагностика классифицируется как: