Название: Нахождение количества разрядов после запятой Отправлено: 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 после деления) Код
Название: 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 Спасибо вам за ответы, теперь я знаю куда двигаться))) ну что ж, будем работать со строкой)))
|