2015-06-07 3 views
1

Я надеялся, что во всех случаях показал 2.33, однако, по какой причине только во втором случае это произошло?По какой причине printf неправильно отображает поплавок?

printf("Without cast: %0.2f\n", 7/3); // Whitout cast: 0.00 
printf("With cast: %0.2f\n", (float) 7/3); // With cast: 2.33 
float x = 7/3; 
printf("With var: %0.2f\n", x); // With var: 2.00 

Я просто заметил это поведение с поплавком. Если я использую целочисленную переменную, этого не происходит.

+1

Это потому, что '7' и' 3' являются 'int'. –

+0

Возможный дубликат [Что определяет тип данных, который будет использоваться для хранения временного значения в?] (Http://stackoverflow.com/questions/10221437/what-decides-what-datatype-that-will-be-used- в магазине-The-временное значение в) – usr2564301

ответ

5

7/3 без броска целочисленного деления, в результате целого числа 2, так как любой остаток отбрасываются, так что это эквивалентно вызовом printf("%0.2f\n", 2);

Теперь, почему, что печать 0 вместо 2? Ну, вы сказали, что это float в строке формата («% 0,2 f»). Поэтому он интерпретирует ваше целое число (0b0 ... 000000000000010) как float. И поплавок, у которого эти биты установлены, равен нулю, с точностью %0.2f

Ваш компилятор должен был дать вам предупреждение о том, что спецификатор формата не соответствует переданному типу. Не игнорируйте предупреждения компилятора!

С отливом отличается, так как приведение имеет приоритет, поэтому (float) 7/3 такой же, как 7.0f/3, что является подразделением с плавающей запятой. С переменной вы делали целочисленное деление, поэтому в итоге получилось 2, но два были добавлены в float, поэтому printf правильно интерпретировал его.

Смежные вопросы