Evgenii Legotckoi
Jan. 5, 2017, 7:21 p.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.

  1. QString str("8564.26495574");
  2. qDebug() << str.toDouble();
  3.  
  4. // 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() .

  1. double a = 8564.26495574;
  2. qDebug() << a;
  3.  
  4. // 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.

  1. QString str("8564.26495574");
  2. bool ok = false;
  3. qDebug() << str.toDouble(&ok);
  4. qDebug() << ok;
  5.  
  6. // The output we get the following
  7. // 8564.26
  8. // 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.

  1. QString str("8564.26495574");
  2.  
  3. double a = 8564.26495574;
  4. double b = str.toDouble();
  5.  
  6. qDebug() << QString("%1").arg(a, 0, 'f', 5);
  7. qDebug() << QString("%1").arg(a, 0, 'g', 5);
  8. qDebug() << QString("%1").arg(a, 0, 'e', 10);
  9. qDebug() << QString("%1").arg(a, 0, 'g', 30);
  10.  
  11. qDebug() << QString("%1").arg(b, 0, 'f', 5);
  12. qDebug() << QString("%1").arg(b, 0, 'g', 5);
  13. qDebug() << QString("%1").arg(b, 0, 'e', 10);
  14. qDebug() << QString("%1").arg(b, 0, 'g', 30);

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

  1. "8564.26496"
  2. "8564.3"
  3. "8.5642649557e+3"
  4. "8564.26495574000000488013029099"
  5.  
  6. "8564.26496"
  7. "8564.3"
  8. "8.5642649557e+3"
  9. "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.

Recommended articles on this topic

By article asked0question(s)

1

Do you like it? Share on social networks!

Alex
  • Feb. 6, 2018, 3:19 p.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, 3:30 p.m.

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
  • A
    Oct. 19, 2024, 5:19 p.m.
    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html