Russian Qt Forum

Программирование => С/C++ => Тема начата: leshden от Июля 01, 2010, 23:28



Название: Нахождение количества разрядов после запятой
Отправлено: leshden от Июля 01, 2010, 23:28
Все привет, программирую в Qt Creator и столкнулся с такой проблемой. Мне нужно получить количество разрядов у double после запятой, нет ли в Qt готовой ф-ии для нахождения????? Я не нашел и стал подручными средствами использовать while:

Допустим: MostMin = -12.3459;

//количество разрядов
int countX = 0;
//остаток
double remainder = fmod(MostMin,0.1);

while(remainder != 0)
        { 
            ++countX;
            remainder = fmod(remainder, 0.1);
            out << remainder;
        }
While зацикливается и возвращает только числа  -0.0459, -0.0459, -0.0459, -0.0459,...
Я ничего не понял, это что ф-ия fmod как-то не так работает или я что-то не так делаю???
Может другая есть в Qt ф-ия для нахождения остатка от деления double?????

Кто может, помогите. Заранее благодарен.


Название: Re: Нахождение количества разрядов после запятой
Отправлено: lit-uriy от Июля 02, 2010, 00:30
>>Допустим: MostMin = -12.3459;
если посмотреть внимательно на это допущение, то можно заметить, что для компьютера это не число, а текстовая строка.
Т.к.
-12.3459 == -1.23459*10 == -123.459*10^-1

Намёк ясен?


Название: Re: Нахождение количества разрядов после запятой
Отправлено: Igors от Июля 02, 2010, 12:15
fmod работает правильно, он возвращает остаток, это число без целой части только если делитель 1.
fmod(-12.3459, 0.1) вернет -0.0459
fmod(-0.0459, 0.1) вернет -0.0459  (целая часть 0 после деления)

Код
C++ (Qt)
int NumDigitsAfterComma( double x, int maxDigits = 10 )
{
int num;
x = fmod(x, 1.0);
for (num = 0; num < maxDigits && x != 0.0; ++num)
 x = fmod(x * 10.0, 1.0);   // edit
 
return num;
}


Название: Re: Нахождение количества разрядов после запятой
Отправлено: leshden от Июля 02, 2010, 16:54
lit-uriy, намек не ясен, подробней можно.
Igors, попробовал делить на 1.0, вот код:

double remainder = fmod(12.53201,1.0);

while(remainder != 0.0)
       {
           //countX - для подсчета количества разрядов
           ++countX;
           remainder = remainder * 10;
           remainder = fmod(remainder,1.0);
           out << "remainder : " << remainder;
           out << "\n";

        }
Выводит:
remainder : 0.3201
remainder : 0.201
remainder : 0.01
remainder : 0.1
remainder : 1
remainder : 1
remainder : 1
remainder : 1
remainder : 1
remainder : 0.999996
remainder : 0.999965
remainder : 0.99965
remainder : 0.996498
remainder : 0.964984
remainder : 0.649845
remainder : 0.498445
remainder : 0.984454 ....

Ведь должен после 1 возвратить 0, я что-то не понимаю как эта fmod работает, подскажите, может код неправильно написан??????


Название: Re: Нахождение количества разрядов после запятой
Отправлено: Igors от Июля 02, 2010, 19:50
Ведь должен после 1 возвратить 0
Не должен. Double (float) хранят значения в виде характеристика-мантисса. Строго говоря, переменная remainder НЕ хранит число 12.53201 (хотя оно было присвоено).

Упрощенно
double число = матисса * (2 в степени характеристика)

На какое число надо умножить 16 (или др. степень двойки) чтобы получить 12.53201 ? Такого точного числа нет, поэтому округление неизбежно (оператор << им тоже занимается, 1 что видите на самом деле 0.9999999...) Поэтому придется использовать прозаическое QString::setNum,  все округляют - и это правильно


Название: Re: Нахождение количества разрядов после запятой
Отправлено: lit-uriy от Июля 02, 2010, 20:32
>>lit-uriy, намек не ясен, подробней можно.
компьютер не хранит числовые данные так, как ты их записываешь на бумаге (об этом уже сказал Igors).
поэтому не пытайся найти положение десятичной запятой в числовых данных.

Преобразуй число в текст с интересующей тебя формой отображения.
Смотри QString::number(...)


Название: Re: Нахождение количества разрядов после запятой
Отправлено: leshden от Июля 02, 2010, 23:19
Спасибо вам за ответы, теперь я знаю куда двигаться))) ну что ж, будем работать со строкой)))