Как безопасно конвертировать этот двойной в int? - PullRequest
5 голосов
/ 02 февраля 2011

У меня есть двойной, который является интервалом времени в секундах. Допустимые значения: 0,0, 0,5, 1,0, 1,5 и т. Д.

Теперь мне нужно преобразовать это значение в int. Но я не могу этого сделать:

int converted = (int)theDouble;

Потому что может случиться так, что мой дубль из-за ошибок с плавающей запятой равен 0,9999999999, а не 1,000000000. Это будет просто отрезать хвост, и мы получим 0 вместо 1. Кроме того, когда мой дубль равен 0,9, я хочу, чтобы int был 1. Когда это 1.1, я хочу, чтобы int был 1. Когда это 1.8, я хочу, чтобы int было 2.

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

Какой самый безопасный способ получить близкое int представление этого двойника? Хотя это двойное число, мне никогда не понадобится более высокая точность, чем 0,5 или одна фрагментальная цифра (я не гений математики и не знаю точных научных терминов).

Ответы [ 5 ]

7 голосов
/ 02 февраля 2011

Вы, вероятно, ищете lround (двойная функция). Подпись выглядит так.

long int lround (double).

Другие варианты

  • long int lrint (double)
  • long long int llrint (double)
  • long long int llround (double)
5 голосов
/ 02 февраля 2011
int converted = (int)round(theDouble);
4 голосов
/ 02 февраля 2011

Сделайте это:

int converted = (int)(round(theDouble));
2 голосов
/ 02 февраля 2011

Как и предполагали другие, вы можете округлить theDouble, но имейте в виду, что вы никогда не должны рассчитывать на переменные с плавающей точкой для точной точности. Вместо того, чтобы пытаться сравнить theDouble с целым числом на равенство, вы должны сделать что-то вроде этого:

if (abs(theDouble - theInteger) <= 0.000001)
    doSomething();

Помните, что перед сравнением theInteger будет приведен к удвоению, поэтому он также может быть неточным.

И последнее, звоню:

int converted = (int) round(theDouble)

немного опасно, потому что, как вы сказали, ошибка с плавающей запятой может привести к снижению значения. Если вы знаете, что ваше значение будет только 0, 0,5, 1,0, 1,5, ..., почему бы не сделать что-то подобное?:

int converted = (int) (round(theDouble) + 0.1)
2 голосов
/ 02 февраля 2011

Используйте round в math.h.Возвращает двойное число, но в вашем случае вы можете привести его к int.Или используйте lround (также в math.h), который принимает удвоение и возвращает длинное целое.

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