Переменная cast to int vs round() - программирование
Подтвердить что ты не робот

Переменная cast to int vs round()

Я видел это в нескольких местах, где (int)someValue был неточным, и вместо этого проблема вызвала функцию round(). В чем разница между двумя?

В частности, если нужно, для C99 C. Я также видел ту же проблему в своих программах при записи их в java.

4b9b3361

Ответ 1

В случае приведения значения float/double в int вы обычно теряете дробную часть из-за целочисленного усечения.

Это сильно отличается от округления, как обычно ожидалось, так что, например, 2.8 заканчивается как 2 с целым усечением, так же, как 2.1 закончится как 2.

Update:

Другой источник потенциальной (грубой) неточности при кастинге связан с ограниченным диапазоном значений, которые могут быть представлены целыми числами, а не с типами с плавающей запятой (спасибо @R, напоминающий нам об этом в комментарии ниже)

Ответ 2

  • Отбрасывание до int обрезает число с плавающей запятой, то есть оно отбрасывает дробную часть.
  • Функция round возвращает ближайшее целое число. Полуфабрикаты округлены от нуля, например, round(-1.5) - -2, а round(1.5) - 2.

7.12.9.6 Круглые функции

Сводка

#include <math.h>
double round(double x);
float roundf(float x);
long double roundl(long double x);

Описание

Функции round округляют свой аргумент до ближайшего целочисленное значение в формате с плавающей запятой, округление на полпути от нуля, независимо от текущего направления округления.

Возвращает

Функции round возвращают округленное целочисленное значение.

Источник: стандарт C99 (ISO/IEC 9899: 1999). Этот раздел не изменился в стандарте C11 (ISO/IEC 9899: 2011).

(Для тех, кто заинтересован, здесь - это четкое введение в алгоритмы округления.)

Ответ 3

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

Проблема с кастингом заключается в том, что он может обрезать ИЛИ раунд. То, что он делает, во многом зависит от языка программирования, незначительно от конкретного используемого компилятора. Это означает, что не существует общего правила для результата, который всегда будет применяться.

Round() универсально используется для генерации результата, аналогичного математическому округлению. Существует краевой кейс, который необходимо специально контролировать для .5, который иногда округляется до следующего четного числа.