Fragen zum Typecast

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
cptnofuture
User
Beiträge: 14
Registriert: Donnerstag 17. Juli 2008, 15:51

Fragen zum Typecast

Beitragvon cptnofuture » Dienstag 31. März 2009, 09:25

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 31. März 2009, 09:46

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)
cptnofuture
User
Beiträge: 14
Registriert: Donnerstag 17. Juli 2008, 15:51

Beitragvon cptnofuture » Dienstag 31. März 2009, 09:58

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Beitragvon b.esser-wisser » Dienstag 31. März 2009, 10:21

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
lunar

Beitragvon lunar » Dienstag 31. März 2009, 10:27

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.
BlackJack

Beitragvon BlackJack » Mittwoch 1. April 2009, 19:13

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder