Evgenii Legotckoi
Evgenii LegotckoiJan. 5, 2017, 8:21 a.m.

Qt/C++ - Lesson 057. Mistakes of output qDebug() for floating-point numbers

When developing software to Qt had a chance encounter with one nuance when outputting floating point numbers through qDebug() . The problem is that not all characters are displayed after the decimal point. In the same sins and output std::cout .

This user case may occur in the following situation:

You have a QString object that contains a certain number of "8564.26495574", which we translate into a floating point number using toDouble() method, and check the result with the output qDebug (), but that's bad luck, the output is false.

QString str("8564.26495574");
qDebug() << str.toDouble();

// The output is -> 8564.26

But in fact we have absolutely the right number, that is, from a string was received number 8564.26495574 just concluded qDebug() shows the rounded result.

The same can be observed if you try to bring a double number value to qDebug() .

double a = 8564.26495574;
qDebug() << a;

// The output is -> 8564.26

Make sure that no errors occur when converting numbers from QString to a double can, using the bool variable, a pointer to which is passed as an argument to toDouble() method.

QString str("8564.26495574");
bool ok = false;
qDebug() << str.toDouble(&ok);
qDebug() << ok;

// The output we get the following
// 8564.26
// true - that is, the error was not

In order to make the correct output, you must use the method of QString::arg() indicating the type of formatting and precission.

QString str("8564.26495574");

double a = 8564.26495574;
double b = str.toDouble();

qDebug() << QString("%1").arg(a, 0, 'f', 5);
qDebug() << QString("%1").arg(a, 0, 'g', 5);
qDebug() << QString("%1").arg(a, 0, 'e', 10);
qDebug() << QString("%1").arg(a, 0, 'g', 30);

qDebug() << QString("%1").arg(b, 0, 'f', 5);
qDebug() << QString("%1").arg(b, 0, 'g', 5);
qDebug() << QString("%1").arg(b, 0, 'e', 10);
qDebug() << QString("%1").arg(b, 0, 'g', 30);

As a result, we obtain the following output of qDebug():

"8564.26496"
"8564.3"
"8.5642649557e+3"
"8564.26495574000000488013029099"

"8564.26496"
"8564.3"
"8.5642649557e+3"
"8564.26495574000000488013029099"

In both cases, we obtain the identical result as here and there number is the same.

A few words about the types of formatting:

  • 'g' - It outputs a predetermined number of symbols starting from the largest digit number in the integer portion;
  • 'f' - It displays the specified number of characters with precision after the decimal point;
  • 'e' - It displays the specified number of characters with precision after the decimal point and indication of the number of hidden charges.

As you can see in the output there is a small error 8564.26495574000000488013029099 . This is connected with features of the mathematical apparatus of the computer on which the calculations are made. The capacity of the bit numbers in any computer is limited, so in the last decimal place rounding occurs, which causes the appearance of such options. This should be considered when accurate calculations.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

Alex
  • Feb. 6, 2018, 4:19 a.m.

Добрый день, подскажите пожалуйста. Столкнулся с проблемой, парсю JSON получаю цифровые значения типа string, пример (QJsonValue(string, "0.0000000001")), делаю преобразование типа в double.

auto strToDouble = [] (const QString str) { return QString(str).toDouble(); };

На выходе у меня получается такое значение 1Е-10, каким образом мне получить значение 0.0000000001 в переменной double. Делать дополнительное преобразование в QML считаю не нормальным.

Alex
  • Feb. 6, 2018, 4:30 a.m.

Решение было найдено. В QML использовал метод JavaScript toFixed() Method, массив data_1[0].toFixed(10), 10 количество мне нужных знаков после запятой.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
L
  • Leo
  • Sept. 26, 2023, 8:43 a.m.

C++ - Test 002. Constants

  • Result:41points,
  • Rating points-8
L
  • Leo
  • Sept. 26, 2023, 8:32 a.m.

C++ - Test 001. The first program and data types

  • Result:93points,
  • Rating points8
Last comments
IscanderChe
IscanderCheSept. 13, 2023, 6:11 a.m.
QScintilla C++ example По горячим следам (с другого форума вопрос задали, пришлось в памяти освежить всё) решил дополнить. Качаем исходники с https://riverbankcomputing.com/software/qscintilla/downlo…
Evgenii Legotckoi
Evgenii LegotckoiSept. 6, 2023, 4:18 a.m.
Qt/C++ - Lesson 048. QThread — How to work with threads using moveToThread Разве могут взаимодействовать объекты из разных нитей как-то, кроме как через сигнал-слоты?" Могут. Выполняя оператор new , Вы выделяете под объект память в куче (heap), …
AC
Andrei CherniaevSept. 5, 2023, 12:37 a.m.
Qt/C++ - Lesson 048. QThread — How to work with threads using moveToThread Я поясню свой вопрос. Выше я писал "Почему же в методе MainWindow::on_write_1_clicked() Можно обращаться к методам exampleObject_1? Разве могут взаимодействовать объекты из разных…
n
nvnAug. 31, 2023, 6:47 a.m.
QML - Lesson 004. Signals and Slots in Qt QML Здравствуйте! Прекрасный сайт, отличные статьи. Не хватает только готовых проектов для скачивания. Многих комментариев типа appCore != AppCore просто бы не было )))
NSProject
NSProjectAug. 24, 2023, 10:40 a.m.
Django - Tutorial 023. Like Dislike system using GenericForeignKey Ваша ошибка связана с gettext from django.utils.translation import gettext_lazy as _ Поле должно выглядеть так vote = models.SmallIntegerField(verbose_name=_("Голос"), choices=VOTES) …
Now discuss on the forum
IscanderChe
IscanderCheSept. 17, 2023, 6:24 a.m.
Интернационализация строк в QMessageBox Странная картина... Сделал минимально работающий пример - всё работает. Попробую на другой операционке. Может, дело в этом.
NSProject
NSProjectSept. 17, 2023, 5:49 a.m.
Помогите добавить Ajax в проект В принципе ничего сложного с отправкой на сервер нет. Всё что ты хочешь отобразить на странице передаётся в шаблон и рендерится. Ты просто создаёшь файл forms.py в нём описываешь свою форму и в …
BlinCT
BlinCTSept. 15, 2023, 9:35 a.m.
Размеры полей в TreeView Всем привет. Пытаюсь сделать дерево вот такого вида Пытаюсь организовать делегат для каждой строки в дереве. ТО есть отступ какого то размера и если при открытии есть под…
IscanderChe
IscanderCheSept. 8, 2023, 9:07 a.m.
Кастомная QAbstractListModel и цвет фона, цвет текста и шрифт Похоже надо не абстрактный , а "реальный" типа QSqlTableModel Да, но не совсем. Решилось с помощью стайлшитов и setFont. Спасибо за отлик!
Evgenii Legotckoi
Evgenii LegotckoiSept. 6, 2023, 3:35 a.m.
Вопрос: Нужно ли в деструкторе удалять динамически созданные QT-объекты. Напр: Зависит от того, как эти объекты были созданы. Если вы передаёте указатель на parent объект, то не нужно, Ядро Qt само разрулит удаление, если нет, то нужно удалять вручную, иначе будет ут…

Follow us in social networks