Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Отбрасывание дробной части


Автор: cadet05 15.1.2011, 22:14
Здравствуйте! Помогите пожалуйста решить проблему.


   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.

Отчего это происходит я знаю, этого объяснять не надо.  Подскажите подалуйста, как этого избежать!!!     

Автор: cadet05 15.1.2011, 23:31
Изложу суть проблемы проще:

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

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

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

или   

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

}  

не работают.

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

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

и

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


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



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

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

почитай про http://ru.wikipedia.org/wiki/Плавающая_запятая


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) {значит целое.}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)