Почему моя программа выводит целое число вместо числа с плавающей точкой? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь написать код, который вычисляет средний возраст 3 человек, с входными данными, являющимися возрастами (целыми числами), а выходными данными являются средние значения (с плавающей точкой).

Но каждый вывод всегда округляется до целого числа, а не с плавающей точкой.Я использую C.

int a, b, c;
float average;

printf("Enter your ages:\n");
scanf("%d %d %d", &a, &b, &c);

average = (a + b + c)/3;
printf("\n The average age of ABC is %f", average);

Кроме того, любые советы о том, как более аккуратно получить данные о возрасте, были бы хорошими, это лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Этот способ вычислений влияет на типы данных.

Когда int работает с int, результат все равно будет int.Если результат содержит десятичную часть, он просто отбрасывается из-за приведения типа к int.

Но если int работает с double или float, результат будет с соответствующимтип double или float.

Так что вам нужно просто превратить любой из операндов в десятичный тип.Например,

average = (a + b + c) / 3.0;

или

average = (float) (a + b + c) / 3;

оба в порядке.

0 голосов
/ 28 декабря 2018

>>>> ...the input being the ages (integers), and the output being the average (float)...

Посмотрите на выражение:

average = (a + b + c)/3;
   |      |_________| |
 float        int    integer constant

Правая часть выражения - все int, поэтому вывод этоговыражение будет int печататься, а не float.Это выражение в конечном итоге присваивает значение int переменной типа float.

Чтобы устранить эту проблему, вы должны знать о неявных правилах продвижения и преобразования типов.С По умолчанию тип продвижения и преобразования

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

[Есть несколько правил над этим правилом, и оно применяется только тогда, когда эти правила не действуют]

Итак, в выражении (a + b + c)/3, если мы изменим integer constant до float constant, тогда результирующий результат всего выражения будет иметь тип float.

average = (a + b + c)/3.0f;

[Нефиксированная плавающая константа имеет тип double.Если суффикс представляет собой букву f или F, плавающая константа имеет тип float.]

Согласно правилам продвижения типов, если у вас есть какая-либо (или все) переменная среди a, b и c типа float результирующее значение выражения с integer constant будет иметь тип float.

Например:

float a, b, c;

Or

int a, b;
float c;  // Of course you don't want to do this because in your example a, b and c
          // represents same thing and you want all of them to be of same type. 
          // This is just for the understanding.

average = (a + b + c)/3;
          |____________|
                 |
          The result of this will be of type float because at least one among a, b and c is 
          of type float and by the type promotion rule other will be promoted to float and 
          (a + b + c) will be calculated as all float type.

Вы также можете использовать приведение типа для решения проблемы.Но при этом также не забывайте правило преобразования типов.

Например, в выражении вы можете сделать

either this
average = (float)(a + b + c)/3;

or this
average = (a + b + c)/(float)3;

При этом результирующее значение выражения будет иметь видвведите float, поскольку тип одного из операндов оператора / равен float.Но если вы сделаете:

average = (float)((a + b + c)/3);

, вы не получите желаемый результат, потому что выражение (a + b + c)/3 будет вычислено, будет иметь значение int, а полученный результат будет иметь тип int, а это не такимеет смысл набирать это приведение после вычисления выражения.

>>>> Also, any advice on how to more neatly get the age inputs would be nice, is this the best way to do it?

На мой взгляд, это не лучший способ, потому что таким образом пользователь не может указать точный возрастгод / месяц / дни (кажется, что вы берете только год в качестве ввода).Для практики такого рода примеров этот способ может быть приемлемым, так как вы вычисляете среднее число 3 чисел, но когда вы пишете какое-то реальное приложение, в котором вы принимаете возраст в качестве ввода от пользователя, этот способ совсем не подходит.Кроме того, вы не делаете никакой проверки ввода пользователя.10000000 или -50 (отрицательное значение) не является допустимым значением для возраста.

0 голосов
/ 28 декабря 2018

Но каждый вывод всегда округляется до целого числа, а не с плавающей точкой

Все, что вам нужно, это:

 float average = (a + b + c)/3.0f;

Обратите внимание, что вам нужно 3.0f длязаставить расчет к плавающей точке.В противном случае он будет обрабатываться только как целое число (так как все a,b,c являются целыми числами).

Вы можете удалить начальное объявление average, а вместо этого объявить его и инициализировать в то же время, что и выше.

Как указал @Patrick, суффикс f здесь полезен, так как без него расчет по умолчанию будет double вместо float, и при назначении произойдет избыточное понижение рейтинга..

Кроме того, любой совет о том, как более аккуратно получить данные о возрасте, был бы хорош, это лучший способ сделать это?

scanf("%d %d %d", &a, &b, &c);

Не уверенесли есть лучший способ.Но это scanf выглядит хорошо для ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...