Эта программа печатает «привет» вместо «Привет». Как?

Ниже приведена программа для if и else

#include #include int main() { float a = 0.7; //a declared as float variable if(a == 0.7) //why it takes only integral part of 0.7 { printf("Hi"); } else { printf("hello"); } return 0; } 

Должна ли эта программа показывать Hi вместо hello поскольку 0,7 равно 0,7?

(Я новичок в программировании на C)

Обратите внимание, что

 float a = 0.7; 

преобразует double значение 0.7 в float а затем

 if(a == 0.7) 

преобразует a в double .

Так как 0.7 не может быть точно представлен в плавающей точке, float и double представления не совсем одинаковы.

Вы можете заставить компилятор оставаться с float как это

 #include int main() { float a = 0.7f; if(a == 0.7f) { printf("Hi"); } else { printf("hello"); } return 0; } 

И теперь программа печатает «Привет», потому что она сравнивается, как с подобным.


В более общем плане вы должны быть очень осторожны в сравнении с плавающей точкой для равенства

 #include int main() { double d = 2.1; d /= 3.0; if(d == 0.7) { puts("Equal"); } else { puts("Unequal"); } printf("%.17f\n", d); printf("%.17f\n", 0.7); return 0; } 

Выход программы

  неравный
 +0,70000000000000007
 +0,69999999999999996

Если вы измените тип данных a на double , он будет распечатывать hi. Это связано с тем, что константы в плавающей запятой, хранящиеся в двойном и не плавающие в длительной двойной точности, являются высокими, а float имеет менее точное, двойное значение, хранящееся в 64-битных двоичных и float значение, хранящееся в 32-битном двоичном формате, будет полностью понятным, если вы увидите метод преобразования чисел с плавающей точкой в ​​двоичное преобразование.