Почему вывод cout << 7/9 * 9; это ноль? - PullRequest
4 голосов
/ 09 октября 2009

Почему вывод следующего кода равен 0 или serven?

cout << 7/9*9;   //output 0 (zero)   why?

float nine = 9;
float seven = 7;
float i = seven/nine*nine;
cout << i     //output 7   Why?

Спасибо за помощь.

Ответы [ 6 ]

31 голосов
/ 09 октября 2009

7/9 * 9 оценивает эти числа как целые числа, поэтому 7/9 оценивается как 0, а 0 * 9 = 0.

Когда вы делали их плавающими, вы выполняли намеченный расчет.

Попробуйте 7.0 / 9 * 9, чтобы получить 7, и тогда вы будете выполнять операцию с плавающей запятой.

6 голосов
/ 09 октября 2009

В C, когда вы делите целые числа, остаток отбрасывается. Здесь вы делаете 7/9, затем берете результат и умножаете на 9. Пошагово, вот что думает C:

7 / 9 = 0
0 * 9 = 0

Когда вы используете поплавки, он работает правильно, потому что остаток больше не сбрасывается.

5 голосов
/ 09 октября 2009

В:

cout << 7 / 9 * 9;

вы делаете целочисленную арифметику. Таким образом, 7/9 - это 0, а 0 * 9 - это 0.

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

cout << 7.0 / 9 * 9;
3 голосов
/ 09 октября 2009

7/9*9 равно (7 / 9) * 9, но поскольку 7 и 9 являются целыми числами, а не числами с плавающей запятой, 7 / 9 равно 0 (частное от деления).

2 голосов
/ 09 октября 2009

Я думаю, что это проблема точности. Операторы / и * имеют одинаковый приоритет, поэтому 7/9 * 9 оценивается слева направо как (7/9) * 9. Подвох в том, что (7/9) равно 0 в целочисленной арифметике. Когда вы сохраняете их как простое число с плавающей точкой, эта операция выполняется с плавающей запятой, которая может хранить 7/9 с большей точностью, чем int.

Если вы хотите выполнить расчет в одну строку без точности, попробуйте:

cout << 7.0f / 9.0f * 9.0f; </p>

1 голос
/ 09 октября 2009

Много правильных ответов уже. Примечание для дополнения: если вы хотите оставить это как целочисленную операцию и не использовать с плавающей запятой, вы хотите упорядочить ее так, чтобы вы делали умножения до деления, чтобы получить наибольшую точность (пока переполнение не происходит во время умножения. Таким образом, скорее чем (7.0/9)*9, который будет преобразован в число с плавающей точкой, вы можете сделать (9*7)/9.

...