Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отбрасывание дробной части, Проблема при отбрасывании дробной части 
:(
    Опции темы
cadet05
Дата 15.1.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.1.2011

Репутация: нет
Всего: нет



Здравствуйте! Помогите пожалуйста решить проблему.


   double t=0;

    for (int i=0;i<100;i++)
    {
        t=t+0.1;
        qDebug() << t <<"  "<< floor(t);
    }

Вывожу таким образом на консоль одновременно значение числа и его округленное значение.
Получаю следующее: (часть вывода)


..............................................

16.5    16 
16.6    16 
16.7    16 
16.8    16 
16.9    16 
17    16 
17.1    17 
17.2    17 
17.3    17 
17.4    17 
17.5    17 
17.6    17 
17.7    17 
17.8    17 
17.9    17 
18    17 
18.1    18 
18.2    18 
18.3    18 
18.4    18 
18.5    18 
18.6    18 
18.7    18 
18.8    18 
18.9    18 
19    19 
19.1    19 
19.2    19 
19.3    19 
19.4    19 
19.5    19 
19.6    19 
19.7    19 
19.8    19 
19.9    19 
20    20 
20.1    20 

.............................................

Почему-то почти всегда округленным значением числа без дробной части является число, меньшее его на единицу. В данной части выведенных строк это касается чисел 17 и 18.

Отчего это происходит я знаю, этого объяснять не надо.  Подскажите подалуйста, как этого избежать!!!     
PM MAIL   Вверх
cadet05
Дата 15.1.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.1.2011

Репутация: нет
Всего: нет



Изложу суть проблемы проще:

Нужно узнать, является ли число типа double целым:

Методы сравнения дробной части с нулём типа 

if (t - floor(t) == 0){
значит целое.
}  

или   

if (t - int(t) == 0) {
значит целое.

}  

не работают.

Также не работают методы:

if (abs( d - (int)(d + 0.5) ) < 0.0001) {
значит целое.
}

и

if (d ==(int)d) {
значит целое.
}


Как узнать!!??!!??!!??



PM MAIL   Вверх
borisbn
Дата 16.1.2011, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



не очень понятен выбор форума С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets ...

в число с плавающей точкой может вообще не получиться хранить целое десятичное число.
например:
double d = 50;
не факт, что (int)d == d

почитай про представление плавающего числа


P.S.
Цитата(cadet05 @  15.1.2011,  23:31 Найти цитируемый пост)
if (abs( d - (int)(d + 0.5) ) < 0.0001) {значит целое.}

вот самый правильный способ, только fabs вместо abs и +0.5 не нужно:
Код

if (fabs( d - (int)d ) < 0.0001) {значит целое.}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.