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.
Добрый день, подскажите пожалуйста. Столкнулся с проблемой, парсю JSON получаю цифровые значения типа string, пример (QJsonValue(string, "0.0000000001")), делаю преобразование типа в double.
На выходе у меня получается такое значение 1Е-10, каким образом мне получить значение 0.0000000001 в переменной double. Делать дополнительное преобразование в QML считаю не нормальным.
Решение было найдено. В QML использовал метод JavaScript toFixed() Method, массив data_1[0].toFixed(10), 10 количество мне нужных знаков после запятой.