Frage zu float

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.
Antworten
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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/
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

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)
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

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 :)
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'
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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)
Benutzeravatar
sparrow
User
Beiträge: 4600
Registriert: Freitag 17. April 2009, 10:28

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