Seite 1 von 1
Frage zu float
Verfasst: Freitag 6. September 2013, 15:51
von Eliazz
Hallo ich muss umbedingt für meine Programmierung ausgeben lassen wieviele Nachkommastellen eine Zahl (sie ist von Typ float) hat. Im Grunde will ich nämlich aus zb. 1.25 --> 125 und aus 1.38726 --> 138726 machen da die Anzahl der Nachkommastellen variert brauche ich eine Operation, kann mir jemand helfen?
MFG
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 16:48
von derdon
Floats sind interessant. Guck dir mal die Zahlen in dem Beispiel unten an und beantworte folgende Frage: „Wie viele Nachkommastellen haben diese Zahlen jeweils deiner Meinung nach?”
Code: Alles auswählen
In [1]: 0.1 + 0.2
Out[1]: 0.30000000000000004
In [2]: 1 / 3.0
Out[2]: 0.3333333333333333
In [3]: 1 / 7.0
Out[3]: 0.14285714285714285
In [4]: from math import pi, e
In [5]: pi
Out[5]: 3.141592653589793
In [6]: e
Out[6]: 2.718281828459045
Edit: Folgender Link mag für dich hilfreich sein:
http://floating-point-gui.de/
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 17:20
von Eliazz
Beispiel 1:
Versteh nicht so ganz warum 0.1 + 0.2 != 0.3 sein sollen...
Beispiel 2:
Unendlich, der Compiler rundet irgendwann weil er der Meinung ist das reicht jetzt mal.
Beispiel 3+4+5:
Siehe 2:
(Bei pi mag es sein das die Zahl schon vorher gerundert wurde, vor dem import...
Danke für den Link =)
(ps: oh mist waren die Fragen jetzt rhetorisch? :O)
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 17:24
von Eliazz
edit: Hm die Seite beantwortet meine Frage nicht wirklich, eigentlich ist das alles ziemlich unrelevant für mein Problem ich brauche nur die Anzahl der Nachkommastellen einer SELBST eingegebenen float

Re: Frage zu float
Verfasst: Freitag 6. September 2013, 17:30
von BlackJack
@Eliazz: Das ist relevant, denn was denkst Du wie viele Nachkommastellen ein selbst eingegebenes 0.1 hat? Kleiner Tipp: Diese Zahl kann intern nicht verlustfrei gespeichert werden, weil 1/10 im Binärsystem eine unendliche Periode hat, dort also irgendwo abgebrochen werden muss wenn die Bits „aufgebraucht” sind.
Lassen wir uns doch mal 60 Nachkommastellen von 0.1 ausgeben:
Code: Alles auswählen
In [5]: '{0:.60f}'.format(0.1)
Out[5]: '0.100000000000000005551115123125782702118158340454101562500000'
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 17:39
von snafu
Eliazz hat geschrieben:edit: Hm die Seite beantwortet meine Frage nicht wirklich, eigentlich ist das alles ziemlich unrelevant für mein Problem ich brauche nur die Anzahl der Nachkommastellen einer SELBST eingegebenen float

Du musst du die Eingabe irgendwo als String abspeichern und z.B. mittels `len(gespeicherte_eingabe.split('.')[1])` die Anzahl an eingegebenen Nachkommastellen ermitteln.
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 18:01
von derdon
Eliazz hat geschrieben:(ps: oh mist waren die Fragen jetzt rhetorisch? :O)
Nein, bei einer rhetorischen Frage ist die Antwort offensichtlich was bei meinen Beispielen nicht der Fall war. Meine Frage war dazu da, zum Nachdenken anzuregen und das hat hoffentlich auch funktioniert

(Wenn du über die Ausgabe von "0.1 + 0.2" verwirrt bist und jetzt herausfinden möchtest, woher das Ergebnis kommt, dann hab ich mein Ziel erreicht)
Re: Frage zu float
Verfasst: Freitag 6. September 2013, 22:52
von sparrow
Unter Umständen sind floats auch gar nicht das was du suchst sondern
decimal:
Code: Alles auswählen
>>> from decimal import Decimal
>>> Decimal("0.1") + Decimal("0.2")
Decimal('0.3')
Und an die Nachkommastellen kommt man bei Decimal recht einfach. Die Funktion as_tuple() gibt einen named Tuple zurück. In "exponent" steht dann die Anzahl der Nachkommastellen, allerdings als negative Zahl.