QString zu double konvertieren

Du bist neu in der Welt von C++? Dann schau hier herein!
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

QString zu double konvertieren

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das liegt aber nicht an dem qDebug?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag 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 ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag 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...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag 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...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Doku lesen: http://doc.trolltech.com/4.6/qpainter.html#setWindow und was steht da? Richtig - Integer
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Welche setWindow-Funktion nimmt nochmal double-Werte?
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

wärest du so nett mir das mit der transformation einmal näher zu erleutern ?
Antworten