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.