Moin!
Nach langer Zeit habe ich mich mal wieder an Python gewagt um ein kleines Script zu schreiben, dass mir eine Datei in einem bestimmten Format einliest und in einem anderen bestimmten Format rausschreibt. An sich kein Problem, bin ich doch auf etwas merkwürdiges gestossen und bitte Euch mir mal beim Erkennen der Ursache zu helfen.
In der Datei, die ich einlesen muss, steht ein Wert für die Variable grid als float. In der Ausgabedatei brauche ich es aber als int. Leider ist der int den ich bekomme irgendwie nicht das, was ich erwarten würde. Hier mal der Code in Auszügen:
[code=py]
out.append("object 2 class gridconnections counts "+str((grid))+" "+str(int(grid))+" "+str(int(grid)))
[/code]
Wenn ich mir out ausgeben lasse bekomme ich auf der Konsole folgendes:
object 2 class gridconnections counts 18.0 17 17
Warum wird 18.0 zu 17? Und wie kriege ich dann 18 dahin?
Vielen Dank,
cpt
Fragen zum Typecast
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
im code Tag muss es =Python heißen.
Wieso zeigst Du uns nicht mal den float Wert der Variablen?
Sonderbar ist folgendes:
Die unnötige Klammer ist wohl dafür verantwortlich. Aber ehrlich gesagt habe ich keinen Schimmer, was die bewirkt. Auf irgend eine Art und Weise wird die float Variable damit "expandiert". Wobei ich den "Überlauf" zu 18 nicht simulieren konnte. Nimm die einfach mal weg und gucke dann, ob sich etwas ändert.
Generell müßte man mal in der Doku wühlen dazu wühlen ...
Strings würde ich nicht so konkatenieren. Das sieht unübersichtlich aus. Lesbarer ist folgendes:
Wieso zeigst Du uns nicht mal den float Wert der Variablen?
Code: Alles auswählen
print repr(grid)
Code: Alles auswählen
In [12]: (17)
Out[12]: 17
In [13]: (17.0)
Out[13]: 17.0
In [14]: (17.1)
Out[14]: 17.100000000000001
Generell müßte man mal in der Doku wühlen dazu wühlen ...
Strings würde ich nicht so konkatenieren. Das sieht unübersichtlich aus. Lesbarer ist folgendes:
Code: Alles auswählen
print "Name: %s, Nummer: %d" % ("Foo", 1234)
-
- User
- Beiträge: 14
- Registriert: Donnerstag 17. Juli 2008, 15:51
Moin!
Also der repr Wert von
ist:
17.999999999999996
Womit wir den Schlamassel wohl haben dürften. Repr() kannte ich vorher noch nicht, werd ich mir aber merken... Als Lösung habe ich jetzt noch ein round() eingefügt, tut seinen Zweck erstmal. Aber das es daran liegt, da wäre ich nicht drauf gekommen... tja, etwas Backgroundwissen hätte mir wohl nicht geschadet...
Danke nochmal!
Gruß,
cpt
Also der repr Wert von
Code: Alles auswählen
print repr(grid)
17.999999999999996
Womit wir den Schlamassel wohl haben dürften. Repr() kannte ich vorher noch nicht, werd ich mir aber merken... Als Lösung habe ich jetzt noch ein round() eingefügt, tut seinen Zweck erstmal. Aber das es daran liegt, da wäre ich nicht drauf gekommen... tja, etwas Backgroundwissen hätte mir wohl nicht geschadet...
Danke nochmal!
Gruß,
cpt
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Da kannst ja auch einfach string-formatting nehmen:
hth, Jörg
Code: Alles auswählen
out.append("object 2 class gridconnections counts %f %.0f %.0f" % (grid, grid, grid))
# oder auch '% ((grid, )*3)', ist aber unlesbar
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Unsinn, dass ist einfach nur die normale Ungenauigkeit von Fließkommazahlen.Hyperion hat geschrieben:Sonderbar ist folgendes:Die unnötige Klammer ist wohl dafür verantwortlich.Code: Alles auswählen
In [12]: (17) Out[12]: 17 In [13]: (17.0) Out[13]: 17.0 In [14]: (17.1) Out[14]: 17.100000000000001
Das das nichts mit den Klammern zu tun hat, hätte man auch ganz einfach selber ausprobieren können:
Code: Alles auswählen
In [767]: 17
Out[767]: 17
In [768]: 17.0
Out[768]: 17.0
In [769]: 17.1
Out[769]: 17.100000000000001