Russian Qt Forum
Май 22, 2024, 08:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование значений  (Прочитано 4916 раз)
PavelVX
Гость
« : Август 28, 2012, 08:36 »

Доброго времени суток!
Понадобилось написать универсальную функцию получающую значения из БД. Написал, но наткнулся на необъяснимое для меня поведение.
    QVariant tst = 32192.96;
    double itog = tst.toDouble();
    qDebug() << itog;
Выведет 32193!!!! но почему?Непонимающий
tst.toString() выведет все как надо.
Начал копать дальше. Получил странный результат: tst.toDouble() почему-то выводит только 5 первых символов.
 tst = 1221937.41; -> 1.22194e+06
Не могли бы более опытные товарищи объяснить, где я не прав или кинуть ссылку на понимание данного поведения.
Всего-то хотелось получать значения из БД, а потом уже приводить к нужному типу, в зависимости от задачи.
« Последнее редактирование: Сентябрь 12, 2012, 08:07 от PavelVX » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Август 28, 2012, 09:06 »

Выведет 32193!!!! но почему?Непонимающий
Потому, что QDebug считает такую точность вывода достаточной. То есть преобразуется всё правильно, просто так выводится:
Код
C++ (Qt)
QVariant tst = 32192.96;
double itog = tst.toDouble();
qDebug() << QString::number( itog, 'G', 10 );
"32192.96"

Ну и да, числа с плавающей точкой хранятся не совсем точно, так что без задания количества значащих разрядов никуда:
Код
C++ (Qt)
QVariant tst = 32192.96;
double itog = tst.toDouble();
qDebug() << QString::number( itog, 'G', 100 );
"32192.9599999999991268850862979888916015625"
Записан
PavelVX
Гость
« Ответ #2 : Август 28, 2012, 10:40 »

Хмм, просто меня засмущало то, что не один qDebug() считает округление нормальным:
QVariant tst = 32192.96;
double itog = tst.toDouble();
QLineEdit->setText(itog);
выведет 32193.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Август 28, 2012, 11:17 »

Видимо 6 знаков - у них стандарт (в первом случае просто в округлённом 32193.0 ноль опущен).
Цитировать
QLineEdit->setText(itog);
Нет у QLineEdit такого сетера.
Записан
PavelVX
Гость
« Ответ #4 : Август 28, 2012, 11:55 »

QLineEdit->setText(QString("%1").arg(itog));
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #5 : Август 28, 2012, 12:08 »

лучше уж QString::number()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PavelVX
Гость
« Ответ #6 : Сентябрь 12, 2012, 08:00 »

А подскажите пожалуйста такую вещь: как мне получить дробную часть без изменений?
double dtmp = 234.24;
int n1, n2;
Хочу в n1 получить целую часть, в n2 дробную.
n1 = dtmp; // все отлично.
n2 = (dtmp - n1)*100; //тут начинаются проблемы: n2 - 23, из-за того, что при преобразовании dtmp = 234.239999;
Как быть-то?
Записан
V1KT0P
Гость
« Ответ #7 : Сентябрь 12, 2012, 08:24 »

А подскажите пожалуйста такую вещь: как мне получить дробную часть без изменений?
double dtmp = 234.24;
int n1, n2;
Хочу в n1 получить целую часть, в n2 дробную.
n1 = dtmp; // все отлично.
n2 = (dtmp - n1)*100; //тут начинаются проблемы: n2 - 23, из-за того, что при преобразовании dtmp = 234.239999;
Как быть-то?
О боже, чем тебя не угодила стандартная функция modf для таких вещей: http://www.cplusplus.com/reference/clibrary/cmath/modf/
Записан
PavelVX
Гость
« Ответ #8 : Сентябрь 12, 2012, 08:26 »

Видимо тем же:
    dtmp = modf(dtmp, &tmp);
    n2 = dtmp*100; //23!
Записан
V1KT0P
Гость
« Ответ #9 : Сентябрь 12, 2012, 08:55 »

Видимо тем же:
    dtmp = modf(dtmp, &tmp);
    n2 = dtmp*100; //23!

Код
C++ (Qt)
   double param, fractpart, intpart;
   param = 234.24;
   fractpart = modf (param , &intpart);
   int value = static_cast<int>(intpart);
В итоге: fractpart = 0.2400000, intpart = 234.000000, value = 234.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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