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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: число с 5 знаками после запятой  (Прочитано 14688 раз)
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« : Ноябрь 19, 2013, 17:51 »

вопрос, наверное, дурацкий, но все же... Имеется таблица в базе MySql, в ней поле Decimal(10,6). В MySql Query Browser'е все отображается правильно, но когда в программе делаю query.exec("SELECT kolvo FROM tab"), query.value(0) показывает мне, что поле это Double. Все бы хорошо, но если в этом поле лежит что-то вроде 0.00005, то
Код:
qDebug()<<qry.value(0).toDouble()<<","<<qry.value(0).toFloat()<<","<<qry.value(0).toString()<<","<<qry.value(0).toReal();
возвращает одно и то же 5e-05. Достаточно поменять хотя бы на 0.0001, отображается все правильно. Как заставить запрос вернуть мне то, что лежит в базе, а не степень числа? Мне это значение в отчет надо выводить...
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
mutineer
Гость
« Ответ #1 : Ноябрь 19, 2013, 18:01 »

5e-05 это и есть 0.00005, только в экспоненциальной форме записи. Искать тебе надо как это в нужном виде вывести куда там тебе надо
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #2 : Ноябрь 19, 2013, 20:47 »

так я об этом и спрашиваю. Qt-программы, похоже, все в экспотенциальной форме отображают данные с больше, чем 4 знаками после запятой. Я TOra использую для просмотра баблиц базы-она тоже 5e-05 показывает, а запрос непосредственно в MySql-строке выдает 0.00005. Так что
Цитировать
Как заставить запрос вернуть мне то, что лежит в базе, а не степень числа?
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
mutineer
Гость
« Ответ #3 : Ноябрь 19, 2013, 21:54 »

Еще раз - запрос возвращает тебе то, что лежит в базе. Ты не так выводишь и тут все зависит от способа, которым ты переводишь double в строку.
Например, если ты используешь QString::number(double n, char format = 'g', int precision = 6), то нужно вторым параметром передать 'f', чтобы выводилось всегда в десятичном виде
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #4 : Ноябрь 20, 2013, 09:28 »

именно то, что надо! Спасибо. Надо было мне лучше Help читать :-(
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
GUVadim
Гость
« Ответ #5 : Ноябрь 28, 2016, 12:24 »

В продолжении темы...
Конвертировал ПО с QT 4.7.8 MinGW x32 на QT 5.6.0 MinGW x32
БД на MySQL 5.1.
В таблице есть поля DOUBLE(11.2) и TINYINT(3).
Запрашиваю их и заливаю в лист. Но при запросе выводит не то что надо...
Код:
QSqlQuery query;
    QString qText = "SELECT summav_o,state "\
            "FROM ordered_cost WHERE year='2016' AND month = '10'";
    query.prepare(qText);
    if(query.exec()){
        while(query.next()){
            QStringList row;
            row.append(query.value(0).toString());  //summav_o DOUBLE(11.2)
            row.append(query.value(1).toString());  //state TINYINT(3)
            Data.append(row);
        }
В итоге в при дебаге TINYINT(3) выводится символами, a DOUBLE(11.2) не с двумя знаками после точки.
Цитировать
DOUBLE(11.2) - "6924483.1900000004"
Цитировать
TINYINT(3) - "\u0004"
(Это цифра 4)

Всё конечно можно исправить для DOUBLE(11.2) - QString::number(query.value(0).toDouble(),'f',2)
а для TINYINT(3)  - QString::number(query.value(1).toInt()).
!Но в коде дохрена аналогичных запросов (около 3 тыщ.).

Пробовал разные драйвера для MySQL, а так же тестировал на сервере версии 5.7, толку нет.

Подскажите пожалуйста как сделать вывод привычным для QT 4.7.8, есть ли какая-то инъекция для выздоровления?
« Последнее редактирование: Ноябрь 28, 2016, 17:01 от GUVadim » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #6 : Ноябрь 28, 2016, 12:50 »

Подскажите пожалуйста как сделать вывод привычным для QT 4.7.8, есть ли какая-то инъекция для выздоровления?

В коде драйвера смотрим:

Код
C++ (Qt)
   case FIELD_TYPE_FLOAT :
   case FIELD_TYPE_DOUBLE :
   case FIELD_TYPE_DECIMAL :
#if defined(FIELD_TYPE_NEWDECIMAL)
   case FIELD_TYPE_NEWDECIMAL:
#endif
       type = QVariant::Double;
       break;
 
И видим, что конвертится в double, отсюда и проблемы, делайте конвертацию в строку средствами базы данных.
Записан
GUVadim
Гость
« Ответ #7 : Ноябрь 28, 2016, 15:07 »

И видим, что конвертится в double, отсюда и проблемы, делайте конвертацию в строку средствами базы данных.
За молниеносный ответ спасибо! )
В каком драйвере такое можно найти? Штатная Qt'эшная библитека?

Про дробь понятно, а что делать с целым числом которое выводится символьно?
И наконец как сдлеть эту конвертацию средствами БД? Мускуле есть функция конвертации, но дробь в строку она не конвертирует (CAST).

Всё было бы ничего, если бы кода было пару строк, но такого кода много.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #8 : Ноябрь 28, 2016, 15:45 »

В каком драйвере такое можно найти? Штатная Qt'эшная библитека?
Код что я привел, тут (относительно корня исходников Qt): src/qtbase/src/sql/drivers/mysql/qsql_mysql.cpp

Про дробь понятно, а что делать с целым числом которое выводится символьно?
Цитата: GUVadim
TINYINT(3) - "\u0004"
попробуйте так:
query.value(1).toInt()

И наконец как сдлеть эту конвертацию средствами БД? Мускуле есть функция конвертации, но дробь в строку она не конвертирует (CAST).
Всё было бы ничего, если бы кода было пару строк, но такого кода много.
если только для вывода, то query.value(0).toString()
иначе искать/писать свой Decimal
Записан
GUVadim
Гость
« Ответ #9 : Ноябрь 28, 2016, 16:50 »

Код что я привел, тут (относительно корня исходников Qt): src/qtbase/src/sql/drivers/mysql/qsql_mysql.cpp
Да, с TINYINT согласен, почему-то переделали в чар этот тип.
Это qsql_mysql.cpp Qt 4.8.7
Код
C++ (Qt)
static QVariant::Type qDecodeMYSQLType(int mysqltype, uint flags)
{
   QVariant::Type type;
   switch (mysqltype) {
   case FIELD_TYPE_TINY :
   case FIELD_TYPE_SHORT :
   case FIELD_TYPE_LONG :
   case FIELD_TYPE_INT24 :
       type = (flags & UNSIGNED_FLAG) ? QVariant::UInt : QVariant::Int;
       break;
А это уже Qt 5.6.0
Код
C++ (Qt)
static QVariant::Type qDecodeMYSQLType(int mysqltype, uint flags)
{
   QVariant::Type type;
   switch (mysqltype) {
   case FIELD_TYPE_TINY :
       type = static_cast<QVariant::Type>((flags & UNSIGNED_FLAG) ? QMetaType::UChar : QMetaType::Char);
       break;
А вот с дробью не понятно, код остался прежним.
--- Qt 4.8.7
Код
C++ (Qt)
case FIELD_TYPE_FLOAT :
   case FIELD_TYPE_DOUBLE :
   case FIELD_TYPE_DECIMAL :
#if defined(FIELD_TYPE_NEWDECIMAL)
   case FIELD_TYPE_NEWDECIMAL:
#endif
       type = QVariant::Double;
       break;
--- Qt 5.6.0
Код
C++ (Qt)
case FIELD_TYPE_FLOAT :
   case FIELD_TYPE_DOUBLE :
   case FIELD_TYPE_DECIMAL :
#if defined(FIELD_TYPE_NEWDECIMAL)
   case FIELD_TYPE_NEWDECIMAL:
#endif
       type = QVariant::Double;
       break;
Дурдом... А хотелось всего-то прицепить внешнюю библиотеку для экспорта в xlsx, т.к. заточена она ток под Qt 5+ (
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #10 : Ноябрь 28, 2016, 16:59 »

Дурдом... А хотелось всего-то прицепить внешнюю библиотеку для экспорта в xlsx, т.к. заточена она ток под Qt 5+ (
Что непонятно?
Decimal в БД - тип с фиксированной точкой;
double - с плавающей. Конвертация происходит не точно.
Записан
GUVadim
Гость
« Ответ #11 : Ноябрь 28, 2016, 17:04 »

Дурдом... А хотелось всего-то прицепить внешнюю библиотеку для экспорта в xlsx, т.к. заточена она ток под Qt 5+ (
Что непонятно?
Decimal в БД - тип с фиксированной точкой;
double - с плавающей. Конвертация происходит не точно.
Т.е. поставить тип Demical в БД и всё будет чётко?
Дело в том что в Qt 4.8.7 Double бралось нормально.
« Последнее редактирование: Ноябрь 28, 2016, 17:07 от GUVadim » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Декабрь 02, 2016, 12:08 »

>>Дело в том что в Qt 4.8.7 Double бралось нормально.

А что значит нормально, какое значение и куда выводилось раньше, какое значение при этом было в БД.
Как стало теперь?

Дебаг не в счёт, он иногда всякую вспомогательную фигню может писать
Записан

Юра.
GUVadim
Гость
« Ответ #13 : Февраль 21, 2017, 11:34 »

Изваняюсь за оффтоп..

>>  что значит нормально, какое значение и куда выводилось раньше, какое значение при этом было в БД.

Производился запрос к БД на мускуле к полям DOUBLE(10.2), потом вытаскивал значение в строку для табличного вида (QTableView) - query.value(0).toString(). В Qt 4.8.7 два знака после запятой выводилось, а в Qt 5.6.0 строка стала выводится с множеством цифр после запятой.
Решение с этой бедой сделал только одно QString::number(query.value(0).toDouble(),'f',2). Пришлось лопатить весь код, но даже ещё не всё поправлено. Исправляю по мере обращения пользователей.

Tinyint пришлось в БД конвертировать в smallint и вывод стал нормальным, цифровым, а не символьным.
На этом вся борьба и закончилась.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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