Russian Qt Forum
Января 19, 2025, 15:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нахождение количества разрядов после запятой  (Прочитано 8276 раз)
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?Непонимающий?

Кто может, помогите. Заранее благодарен.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июля 02, 2010, 00:30 »

>>Допустим: MostMin = -12.3459;
если посмотреть внимательно на это допущение, то можно заметить, что для компьютера это не число, а текстовая строка.
Т.к.
-12.3459 == -1.23459*10 == -123.459*10^-1

Намёк ясен?
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июля 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;
}
« Последнее редактирование: Июля 02, 2010, 12:45 от Igors » Записан
leshden
Гость
« Ответ #3 : Июля 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 работает, подскажите, может код неправильно написан?Непонимающий??
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июля 02, 2010, 19:50 »

Ведь должен после 1 возвратить 0
Не должен. Double (float) хранят значения в виде характеристика-мантисса. Строго говоря, переменная remainder НЕ хранит число 12.53201 (хотя оно было присвоено).

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

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июля 02, 2010, 20:32 »

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

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

Юра.
leshden
Гость
« Ответ #6 : Июля 02, 2010, 23:19 »

Спасибо вам за ответы, теперь я знаю куда двигаться))) ну что ж, будем работать со строкой)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.