Beim Entwickeln von Software auf Qt bin ich auf eine Nuance gestoßen, als ich Fließkommazahlen mit qDebug() angezeigt habe. Das Problem ist, dass nicht alle Zeichen nach dem Dezimalkomma angezeigt werden. Dasselbe gilt für die Ausgabe von std::cout .
Ein ähnlicher Anwendungsfall kann in der folgenden Situation auftreten:
Sie haben ein QString-Objekt, das eine Zahl „8564.26495574“ enthält, die wir mit der Methode toDouble(), in einen Float konvertieren und das Ergebnis mit der Ausgabe von qDebug() überprüfen, aber hier ist das Problem , stellt sich die Schlussfolgerung als falsch heraus.
QString str("8564.26495574"); qDebug() << str.toDouble(); // В выводе получаем -> 8564.26
Während wir tatsächlich genau die richtige Zahl erhalten, d. h. die Zahl 8564.26495574 wurde aus dem String empfangen, zeigt die Ausgabe von qDebug() nur ein gerundetes Ergebnis.
Dasselbe kann man beobachten, wenn man versucht, einfach den Wert der Zahl double in qDebug() auszugeben.
double a = 8564.26495574; qDebug() << a; // В выводе получаем -> 8564.26
Sie können sicherstellen, dass beim Konvertieren einer Zahl von QString in Double keine Fehler auftreten, indem Sie die bool-Variable verwenden, deren Zeiger als Argument an die Methode toDouble(). übergeben wird.
QString str("8564.26495574"); bool ok = false; qDebug() << str.toDouble(&ok); qDebug() << ok; // В выводе получим следующее // 8564.26 // true - то есть ошибок не было
Für eine korrekte Ausgabe müssen Sie die Methode QString::arg() mit dem angegebenen Formatierungstyp und der angegebenen Genauigkeit verwenden.
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);
Als Ergebnis erhalten wir die folgende Ausgabe qDebug():
"8564.26496" "8564.3" "8.5642649557e+3" "8564.26495574000000488013029099" "8564.26496" "8564.3" "8.5642649557e+3" "8564.26495574000000488013029099"
In beiden Fällen erhalten wir ein identisches Ergebnis, da die Zahl dort und dort gleich ist.
Ein paar Worte zu Formatierungstypen:
- 'g' - zeigt die angegebene Anzahl von Zeichen beginnend mit der größten Ziffer im ganzzahligen Teil der Zahl an;
- 'f' - zeigt die angegebene Anzahl von Zeichen mit Dezimalgenauigkeit an;
- 'e' - zeigt die angegebene Anzahl von Zeichen mit Dezimalgenauigkeit und die Anzahl der versteckten Ziffern an.
Wie Sie sehen, gibt es einen kleinen Fehler in der Ausgabe 8564.26495574000000488013029099. Dies liegt bereits an den Besonderheiten des mathematischen Apparats des Computers, auf dem die Berechnungen durchgeführt werden. Die Kapazität von Zahlen in jedem Computer ist begrenzt, daher wird in der allerletzten Ziffer nach dem Dezimalkomma gerundet, wodurch solche Varianten der Zahl auftreten. Dies muss bei genauen Berechnungen berücksichtigt werden.
Добрый день, подскажите пожалуйста. Столкнулся с проблемой, парсю JSON получаю цифровые значения типа string, пример (QJsonValue(string, "0.0000000001")), делаю преобразование типа в double.
На выходе у меня получается такое значение 1Е-10, каким образом мне получить значение 0.0000000001 в переменной double. Делать дополнительное преобразование в QML считаю не нормальным.
Решение было найдено. В QML использовал метод JavaScript toFixed() Method, массив data_1[0].toFixed(10), 10 количество мне нужных знаков после запятой.