Seite 1 von 2

QString zu double konvertieren

Verfasst: 27. August 2010 20:52
von marvel
hallo,
gibt es eine möglichkeit zu bestimmen wieviele nachkommastellen beim konvertieren erzeugt werdenb sollen.

vor dem konvertieren:

711.118/6654.498
711.159/6654.456
711.365/6654.254

nach dem konvertieren:
711.118/6654.49
711.159/6654.45
711.365/6654.25

er schneidet für den zweiten wert einfach die 3 nachkommastelle weg.

eine datenzeile die ich aus aus einer datei entnehme sieht so aus...

pos#716.562#6661.269

...dann gehe ich hin und konvertiere folgendermaßen:

Code: Alles auswählen

QStringList list;
list = line.split("#");	
qreal x = list.at(1).toDouble();
qreal y = list.at(2).toDouble();
qDebug() << x << " " << y;
object->getCoordinateList().append(QPointF(x,y));
die dritte nachkommastelle ist sehr wichtig, da es die genauigkeit beim zeichnen wesentlich beeinflußt

Verfasst: 27. August 2010 21:32
von upsala
Das liegt aber nicht an dem qDebug?

Verfasst: 27. August 2010 22:01
von Christian81
upsala hat geschrieben:Das liegt aber nicht an dem qDebug?
Doch, hundertprozentig. Immerhin wurde nicht 6654.498 mit dem Rückgabewert von toDouble() verglichen...

Verfasst: 27. August 2010 22:01
von marvel
anhand der ausgabe die ich zeichne würde ich schätzen das es nicht an dem qdebug liegt. wie könnte ich das am besten ausschliessen bzw überprüfen ?

Verfasst: 29. August 2010 10:32
von Christian81
1. Wenn toDouble() falsch sein würde ... naja und wenn ein Konvertierfehler auftritt gibts immer noch den bool* - Parameter zum abfragen.
2. Fliesskommazahlen zu vergleichen ist imemr so eine Sache. Am sinnvollsten ist es ggf. sie mit 100 (oder wie genau deine Zahlen immer sein müssen) zu multiplzieren und dann in einen Integer zu wandeln und diesen Wert zu vergleichen. Aber wie gesagt - eigentlich unnötig wegen 1.

Verfasst: 29. August 2010 15:04
von marvel
1. Wenn toDouble() falsch sein würde ... naja und wenn ein Konvertierfehler auftritt gibts immer noch den bool* - Parameter zum abfragen.
2. Fliesskommazahlen zu vergleichen ist imemr so eine Sache. Am sinnvollsten ist es ggf. sie mit 100 (oder wie genau deine Zahlen immer sein müssen) zu multiplzieren und dann in einen Integer zu wandeln und diesen Wert zu vergleichen. Aber wie gesagt - eigentlich unnötig wegen 1.
ich habe aus Testzwecken mal alle doubles nach int konvertiert und jetzt zeichnet er richtig. ist aber nur eine übergangslösung, da ich mit double zeichnen möchte.

...habe bisher folgendermaßen verglichen :

Code: Alles auswählen

qreal x = list.at(1).toDouble();
qreal y = list.at(2).toDouble(); 
qDebug() << list.at(1) << " " << list.at(2);
qDebug() << x << " " << y;
qDebug() << QString::number(x) << " " << QString::number(y);
ausgabe:

"711.118" "6654.495"
711.118 6654.49
"711.118" "6654.49"

das erste ist der unveränderte string aus der datei. der zweite wert ist nach dem konvertieren von string nach double und am ende habe ich nochmal nach string konvertiert. meiner meinung nach schneidet er einfach eine kommastelle ab.

Verfasst: 29. August 2010 16:53
von Christian81

Code: Alles auswählen

ich habe aus Testzwecken mal alle doubles nach int konvertiert und jetzt zeichnet er richtig. ist aber nur eine übergangslösung, da ich mit double zeichnen möchte. 
Wo habe ich gesagt dass Du mit int zeichnen sollst? Du wolltest Zahlen vergleichen!

Verfasst: 29. August 2010 16:57
von marvel
ich habe doch nicht behauptet das du gesagt hast das ich mit int zeichnen soll. ich habe einfach die doublewerte mit 1000 multipliziert und dann nach int konvertiert um zu überprüfen ob er überhaupt richtig zeichnet. da das goot sei dank funktioiniert suche ich jetzt einfach nach einer lösung wie ich das mit den doublewerten machen kann ohne nach int zu konvertieren.

ich bin anfänger und mache fehler...

Verfasst: 29. August 2010 17:21
von Christian81
Zum 5. mal - das ist nur ein Anzeigeproblem bei der Ausgabe von qDebug() und fprintf und allen anderen!

/edit: http://de.wikipedia.org/wiki/Gleitkomma ... arithmetik

Verfasst: 29. August 2010 17:57
von marvel
Zum 5. mal - das ist nur ein Anzeigeproblem bei der Ausgabe von qDebug() und fprintf und allen anderen!
okay,
ich habs mittlerweile auch verstanden das die konvertierten werte von qdebug anders ausgegeben werden. dies kann man übrigens mit der funktion qSetRealNumberPrecision() beeinflußen. jetzt habe ich nur noch keine antwort auf die unterschiede beim zeichnen. wenn ich also mit integer arbeite klappt alles. mit double zeichnet er ungenau, es sieht so aus als würde er nur die zahlen vor dem komma verwerten.

bsp.:

painter->setWindow(709.105,6637.230,743.614,6665.640);

739.578 6659.563
739.703 6659.268
739.811 6659.004
738.947 6662.546
739.259 6660.348
739.381 6660.012
738.962 6662.691

zeichnet falsch !


das ganze auf integer abgeglichen:

painter->setWindow(709105,6637230,743614,6665640);

739578 6659563
739703 6659268
739811 6659004
738947 6662546
739259 6660348
739381 6660012
738962 6662691

zeichnet richtig !

ich bin wie gesagt anfänger und sicherlich hab ich einen denkfehler nur bitte nicht direkt ranzig werden wenn man etwas nicht versteht...danke...

Verfasst: 29. August 2010 18:15
von Christian81
Doku lesen: http://doc.trolltech.com/4.6/qpainter.html#setWindow und was steht da? Richtig - Integer

Verfasst: 29. August 2010 18:24
von upsala
Welche setWindow-Funktion nimmt nochmal double-Werte?

Verfasst: 29. August 2010 18:30
von marvel
Doku lesen: http://doc.trolltech.com/4.6/qpainter.html#setWindow und was steht da? Richtig - Integer
gehn wir davon aus das durch setWindow(709,743,6637,6665) der wertebereich für x von
709 - 743 und für y von 6637 - 6665 geht. dann muss er doch auch kommazahlen in diesem wertebereich berücksichtigen oder schneidet er ab ?
Welche setWindow-Funktion nimmt nochmal double-Werte?
eine setWindow funktion oder ähnliches für double gibt es laut api nicht


im endeffekt macht es einfach keinen sinn setWindow nur für integer werte anzubieten, denn fallen alle zeichenprimitiven die mit fließkommazahlen arbeiten weg. das muss auch anders gehen

Verfasst: 29. August 2010 18:51
von Christian81
Es gibt nunmal keine setWindow() - Funktion welche Fliesskommazahlen annimmt. Außerdem wüsste ich so auf Anhieb auch keinen Grund. Das ganze geht auch einfach mit einer Transformation.

Verfasst: 29. August 2010 18:58
von marvel
wärest du so nett mir das mit der transformation einmal näher zu erleutern ?