Evgenii Legotckoi
Evgenii Legotckoi5. Januar 2017 08:21

Qt/C++ - Lektion 057. Fehler bei der Ausgabe von qDebug() für Gleitkommazahlen

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.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Alex
  • 6. Februar 2018 04:19

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

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

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

Alex
  • 6. Februar 2018 04:30

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken