Qt и C ++, чтобы показать большое число DECIMAL из MySQL без научной записи - PullRequest
0 голосов
/ 30 марта 2011

У меня большое значение в MySQL.Он правильно хранится в MySQL как DECIMAL (22,2).Я подтвердил, что значение хранится правильно.Если я запускаю запрос через командную консоль, я получаю правильное значение обратно в желаемой ненаучной форме (значение и форма: 99996543210987654321.99).

Проблема в том, что когда я запускаю запрос с помощью Qt /C ++ Я не вижу, как я могу показать число в ненаучной записи.Я получаю (9.99965432109877e + 19) вместо (99996543210987654321.99).Я хочу позже.

В C ++ / Qt Вот так я извлекаю значение из запроса Qt.
(1) Сначала я открываю соединение базы данных с MySQL с помощью Qt.
(2) Затем я делаю запрос, чтобы найти конкретную запись.Пока все хорошо.
(3) Затем я извлекаю конкретное значение поля из возвращенной записи, найденной запросом, используя точный код, указанный ниже.
* ПРИМЕЧАНИЕ.QSqlQuery :: value возвращает Qvariant.
http://doc.qt.io/qt-5/qvariant.html#QVariant-30

if( query3.next() )
{
   QVariant number = query3.value(query3.record().indexOf("account_balance"));
   qout << number.toString() << endl;
}

Я также пытался (с тем же результатом).

if( query3.next() )
{    
 qout<<query3.value(query3.record().indexOf("account_balance")).toString()<<endl;
}

Просто добавить "qout "это просто QTextStream.Я думаю, что проблема не в qout, потому что код ниже выводит 99996543210987654321.99 как без научной нотации.

qout << "99996543210987654321.99" << endl;

Как я могу вернуть значение 99996543210987654321.99 как есть без округления с ++ / qt и без научной нотации?

.
.
.
.
.
.


РЕДАКТИРОВАТЬ:
попытался по предложению Пита

char string_account_balance[32] = "";
sprintf( string_account_balance, "%.2f", query3.value(query3.record().indexOf("account_balance")).toString() );

Получил ошибки и сбой.Ошибки:
(1) не могут передавать объекты не POD типа 'class QByteArray' через '...';вызов прервет выполнение
(2). Формат «% .2f» ожидает тип «double», но аргумент 3 имеет тип «int».

Ответы [ 4 ]

2 голосов
/ 16 января 2012

При изучении использования десятичного типа в Qt в сочетании с MySQL я обнаружил эту тему.

Я догадался, что причина этой проблемы проста: когда Qt читает данные из полей DECIMAL, онпреобразует его в двойной.Итак, я взглянул на источник драйвера MySQL для Qt, расположенный по адресу QtSDK / QtSources / 4.7.4 / src / sql / drivers / mysql / qsql_mysql.cpp В функции qDecodeMYSQLType я нашел следующие строки:

    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;

Итак, я был прав, он обрабатывает DECIMAL так же, как DOUBLE.

Решение проблемы простое.Просто измените эту часть кода на

    case FIELD_TYPE_FLOAT :
    case FIELD_TYPE_DOUBLE :
        type = QVariant::Double;
        break;
    case FIELD_TYPE_DECIMAL :
#if defined(FIELD_TYPE_NEWDECIMAL)
    case FIELD_TYPE_NEWDECIMAL:
#endif
        type = QVariant::String;
        break;

и перестройте плагин MySQL.

Мое приложение теперь правильно читает тип DECIMAL.

1 голос
/ 30 марта 2011

QSqlQuery :: value () возвращает QVariant, и не существует QVariant :: toLongDouble или чего-либо подобного (кроме toString (), который не работает).Поэтому вам нужно выполнить преобразование в MySQL - ALTER TABLE с опцией CHANGE, чтобы изменить DECIMAL на VARCHAR или что-то в этом роде, запросить результат, а затем изменить его обратно.В противном случае, похоже, вам не повезло, особеннодал ссылку на MSalters опубликовал.

1 голос
/ 31 марта 2011

@ user440297 - Я пытался (хотя и пытался) добавить это как комментарий пару часов назад. Я думаю, нет.

Когда я сталкиваюсь с этой самой проблемой в программе на C (хотя и не на C ++), спецификация формата% .nf спасает день. Я обычно говорю что-то вроде:

// instead of:   
//  QVariant number = query3.value(query3.record().indexOf("account_balance"));<br>
// use, approximately:

  char string_account_balance[32] = "";
  sprintf( string_account_balance, %.2f%, query3.value( query3.record().indexOf( "account_balance" ));

Это должно дать вам все необходимые вам целые цифры, десятичную точку и две десятичные цифры.

Не изменяйте десятичное (22,2) поле MySQL. Если это varchar, вам придется разобраться со всей арифметикой и ... о, чувак, об этом слишком страшно думать. В любом случае, это просто проблема форматирования вывода, а не проблема внутреннего хранилища или проблема Qt.

Я всегда держался в стороне от формата% f, потому что считал, что создает проблемы с форматом с плавающей точкой; Не так. Вместо этого возникают проблемы с форматированием с плавающей запятой испарение.

- Пит

0 голосов
/ 30 марта 2011

Qt, вероятно, помещает число в научную нотацию, потому что ваше число состоит из 22 десятичных цифр. Двойники могут хранить 53 бита мантиссы, что означает не более 16 десятичных цифр (см. http://en.wikipedia.org/wiki/Double_precision_floating-point_format).

С учетом вышесказанного, возможно, вы могли бы попробовать длинный двойной тип или какой-либо другой тип, который может хранить все 22 десятичных знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...