2017-01-18 2 views
1

Это действительно основной вопрос, я тестирую зЬй :: COUT для печати поплавка, следующие работы правильно:Std :: cout не печатает ожидаемый поплавок?

std::cout<<10/3.2<<std::endl; //Output: 3.125 

Но когда я пытаюсь:

std::cout<< 500000/1000000<<std::endl; //Output: 0 

Почему выход моего второй пример не 0,5? Это автоматически округляет?

Я компиляция с g++ -std=c++14

+3

Потому что это не поплавок. – harold

+2

'500000/1000000' - это * не * выражение' float', это выражение 'int'. Сделайте это 'float' с литой или' double', добавив '.0' к одному или обоим числам. – dasblinkenlight

+0

Оба операнда являются целыми числами, поэтому вы просто выполняете целочисленное деление. Заставьте один операнд плавать или удваивать, чтобы выполнить двойную операцию. –

ответ

2

Оценочное постоянное выражение времени компиляции 500000/1000000 будет оцениваться в целочисленной арифметике, что фактически означает, что любой остаток отбрасывается. (Обратите внимание, что / имеет более высокий приоритет, чем <<, поэтому сначала оценивается деление).

Ясный rememdy должен продвигать один из аргументов в плавающую точку (другой затем автоматически продвигается компилятором). Я всегда выбираю первый, чтобы сообщить читателю вашего кода, что вы знаете, что вы делаете:

500000.0/1000000 
4

В вашем втором примере кода 500000 и 1000000 оба имеют целочисленный тип, поэтому, когда вы делите друг к другу, то есть целочисленное деление (результат округляется дно), который 0. Чтобы исправить это, попробуйте их умножить на 1.0 или на листинг на любой тип с плавающей точкой.

+0

Спасибо, это имеет смысл. –

+0

Они могут быть не 'int' на форме с 16-битным 'int'. Вот почему я осторожен в своем ответе, чтобы не говорить о конкретном типе. – Bathsheba

+0

@ Bathsheba вы правы – alexeykuzmin0

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