Раздел: Статьи / С/С++ /

Округление до целого в Си

Все способы изучить С++ Все способы изучить С++

Начинающие программисты даже не догадываются о том, какой огромный пласт в этой области скрыт от их глаз, и чего многие из новичков не увидят никогда, потому что это тёмная сторона программирования - чистый исходный код системного уровня… Подробнее...

В С/С++, как и в других языках программирования, не так всё просто при работе с числами. Новички часто сталкиваются с неожиданностями при выполнении, казалось бы, простых математических операций.

Например, у нас есть три переменных:

int n1 = 1, n2 = 2, n3 = 2;

И мы хотим вычислить среднее значение. Понятно, что среднее значение здесь будет вещественным числом, поэтому мы объявляем переменную типа float, а затем пытаемся присвоить ей результат соответствующей математической операции:

float x;
x = (n1 + n2 + n3) / 3;

Поскольку 1 + 2 + 2 = 5, то логично предположить, что после этого х будет равно 1,666. Ну там ещё будут знаки после запятой - сейчас пока это неважно.

Однако, когда мы выведем х на экран, то сильно удивимся, потому что на экране мы увидим число 1. Какого хрена?

Но это ещё ничего. А вот если вы сделаете так:

x = n1/3 + n2/3 + n3/3;

то х вообще окажется равен 0.

А всё дело в том, что переменные n1, n2, n3 имеют целочисленный тип. Поэтому результат выражения (n1 + n2 + n3) / 3 тоже будет целочисленным. А при целочисленном делении остаток от деления просто отбрасывается, и число 1,666 превращается в 1 (а во втором варианте в 0). Поэтому для таких случаев недостаточно объявить переменную х как float. Все переменные, используемые в выражении, также должны иметь тип float или другой вещественный.

Но что делать, если переменные уже объявлены и по каким-то причинам менять их тип вы не хотите? В этом случае надо в выражении явно преобразовать целый тип в вещественный. Сделать это можно для каждой переменной отдельно или для всего выражения. Например, так:

x = float(n1 + n2 + n3) / 3;

Округление до целого в Си

В этом случае всё отработает так, как мы хотели, и после выполнения операции в х будет число 1,66667 (ну или близкое к этому - зависит от компилятора и от типов данных).

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

Если что-то осталось непонятно, см. видео:


Быстрый старт в С++ Быстрый старт в С++

Бесплатная небольшая книга, которую не надо читать полгода, но которая покажет вам, что такое С++ и как начать его изучение. А также поможет решить, надо ли вам это вообще. Кроме того, подписавшись на рассылку, вы будете получать от меня полезные материалы по С++, которые я периодически выпускаю... Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика