В C 0.1
- это константа с плавающей запятой двойной точности, т.е. ее можно рассматривать как имеющую тип double
.0.1 не может быть точно представлен ни float
, ни double
.Это похоже на то, что 1/3 не представляется точно в базе 10 с конечным числом цифр.
Преобразования, необходимые для добавления 0.1
к float
, теряют точность (это отсекает часть дробицифры), что затрудняет сравнение на равенство.
У вас есть три варианта.Ваша программа будет работать так, как вы ожидаете, если вы либо
- замените объявления
float
на double
объявлений - замените каждый экземпляр
0.1
на 0.1f
- используйте предложение Педро
Первое делает ваши переменные числами с двойной точностью, а второе делает ваши константы числами с одинарной точностью.
Однако существует более широкая проблема ссравнивая значения с плавающей запятой для равенства в этом, за исключением дробей, в которых знаменатель является степенью 2, ни одно число не может быть выражено в точности как float
или double
.Вам нужно сделать что-то вроде , что Педро предлагает .