@dandropov95

Как работать с делением и типами в Си?

У меня к примеру в ходе каких то вычислений получилось 2 числа. Первое это накопленная сумма. Второе количество чисел. Нужно к примеру найти среднее арифметическое. Как в данном случае поступить? Значение может получиться как целым так и вещественным, хотя в вычислениях будут участвовать только целые числа.

Пример:
printf("%d\n", 23 / 4);
printf("%f\n", 23 / 4); // (float) 23 / 4


В первом случае все норм получается что по факту не находиться среднее арифметическое, так как отбрасывается дробная часть.
Во втором случае, так как в вычислениях участвуют только целые числа, результат получается нулевым при выводе как вещественное число.

Как правильно написать это? Заранее не известно же каким будет результат, целым или вещественным.
  • Вопрос задан
  • 221 просмотр
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
Если хотите, чтобы деление "учитывало" возможную дробную часть, то:
- всегда в делении одно из чисел должно быть float (double)
- всегда результат помещать в float (double)
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Заранее не известно же каким будет результат, целым или вещественным.

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

В отличии от языков с динамической типизацией, в С/С++ программист сам должен контролировать тип результата выражения и там где нужно делать преобразования типов явно для получения результата нужного типа.
И это не недостаток языка.
Ответ написан
Комментировать
В C любая константа имеет тип. 23 и 4 это две целочисленные константы, к ним применяется операция деления, в результате арифметической операции над целыми числами всегда будет целое число. Чтобы константа была с плавающей точкой, она должна содержать точку. Т.е. правильно 23./4. - перечитайте про задание констант.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы