Seite 1 von 1

Fragen zum Typecast

Verfasst: Dienstag 31. März 2009, 09:25
von cptnofuture
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

Verfasst: Dienstag 31. März 2009, 09:46
von Hyperion
im code Tag muss es =Python heißen.

Wieso zeigst Du uns nicht mal den float Wert der Variablen?

Code: Alles auswählen

print repr(grid)
Sonderbar ist folgendes:

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
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:

Code: Alles auswählen

print "Name: %s, Nummer: %d" % ("Foo", 1234)

Verfasst: Dienstag 31. März 2009, 09:58
von cptnofuture
Moin!

Also der repr Wert von

Code: Alles auswählen

print repr(grid)
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

Verfasst: Dienstag 31. März 2009, 10:21
von b.esser-wisser
Da kannst ja auch einfach string-formatting nehmen:

Code: Alles auswählen

out.append("object 2 class gridconnections counts %f %.0f %.0f" % (grid, grid, grid))
 # oder auch '% ((grid, )*3)', ist aber unlesbar
hth, Jörg

Verfasst: Dienstag 31. März 2009, 10:27
von lunar
Hyperion hat geschrieben:Sonderbar ist folgendes:

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
Die unnötige Klammer ist wohl dafür verantwortlich.
Unsinn, dass ist einfach nur die normale Ungenauigkeit von Fließkommazahlen.

Verfasst: Mittwoch 1. April 2009, 19:13
von BlackJack
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