Einfache Möglichkeit, Dezimalstellen zu finden

Gibt es eine einfache Möglichkeit oder integrierte Funktion, um die Dezimalstellen einer Gleitkommazahl herauszufinden?

Die Zahl wird aus einer Zeichenkette analysiert, so dass eine Möglichkeit ist, die Ziffern nach dem '' 'zu zählen. Zeichen, aber das sieht mir ziemlich ungeschickt aus. Gibt es eine Möglichkeit, die benötigten Informationen aus einem float oder Decimal Objekt zu erhalten?

LÖSUNG (einer von ihnen, natürlich :))

Ich wählte die python decimal.Decimal Klasse, um mir mit meinem Problem zu helfen:

 e = abs(Decimal(string_value).as_tuple().exponent) 

HINWEIS: Dies funktioniert nur, wenn der Parameter, aus dem die Dezimalzahl aufgebaut ist, ein String ist und kein Float (was zu Gleitkomma-Ungenauigkeiten führen würde).

Vielen Dank für alle anderen Beiträge.

8 Solutions collect form web for “Einfache Möglichkeit, Dezimalstellen zu finden”

Um zu wiederholen, was andere gesagt haben (weil ich es schon eingegeben hatte), bin ich nicht einmal sicher, dass ein solcher Wert im Falle einer Gleitkommazahl sinnvoll wäre, wegen der Differenz zwischen der dezimalen und der binären Darstellung; Oft eine Zahl, die durch eine endliche Anzahl von Dezimalstellen repräsentativ ist, hat nur eine unendlich-stellige Darstellung in binärer.

Im Falle eines decimal.Decimal Objekts kannst du den Exponenten mit der Methode as_tuple , die ein namedtuple mit as_tuple , digits- und exponent Attributen zurückgibt:

 >>> d = decimal.Decimal('56.4325') >>> d.as_tuple().exponent -4 >>> d = decimal.Decimal('56.43256436') >>> d.as_tuple().exponent -8 

Die Negation des Exponenten ist die Anzahl der Ziffern nach dem Dezimalpunkt, es sei denn, der Exponent ist größer als 0 .

"Die Anzahl der Dezimalstellen" ist nicht wirklich eine Eigenschaft, die eine Gleitkommazahl hat, weil sie intern gespeichert und gehandhabt werden. Sie können so viele Dezimalstellen erhalten, wie Sie es von einer Fließkommazahl mögen. Die Frage ist, wie viel Genauigkeit Sie wollen. Beim Umwandeln einer Gleitkommazahl in einen String entscheidet ein Teil des Prozesses über die Genauigkeit.

Versuchen Sie zum Beispiel:

 1.1 - int(1.1) 

Und du wirst sehen, dass die Antwort ist:

 0.10000000000000009 

Also, für diesen Fall ist die Anzahl der Dezimalstellen 17. Ist das die Nummer, die du willst?

Wahrscheinlich nicht.

Sie können jedoch die Zahl auf eine bestimmte Anzahl von Dezimalstellen mit "runden" runden:

 round(3.1415 - int(3.1415), 3) 

Für diesen Fall wird die Anzahl der Dezimalstellen auf 3 geschnitten.

Sie können nicht "die Anzahl der Dezimalstellen aus einem Float", aber Sie können entscheiden, die Genauigkeit und wie viele Sie wollen. Das Umwandeln eines Schwimmers in einen String ist eine Möglichkeit, eine solche Entscheidung zu treffen.

Ein naiver Weg (anfällig für lokalisierte Nutzung von @jglouie erwähnt) ist

 len(foo.split('.')[1]) 

Wo foo ist ein String wie "23.512999238".

BEARBEITEN

Wie @Thomas Jung und @Mark Ransom erwähnt, ist das eher naiv für einige Eckfälle, die als …

 import re from locale import localeconv dec_pt = localeconv()['decimal_point'] decrgx = re.compile("\d+(%s\d+)?e(-|\+)(\d+)" % dec_pt) if decrgx.search(foo): # still figuring this out raise NotImplementedError, "e notation not implemented" else: digits = len(foo.split(dec_pt)[-1]) 

Die dezimale Bibliothek ist für die Arbeit mit Dezimalzahlen, wie im Accounting. Es ist nicht inhärent eine Funktion, die Anzahl der Dezimalstellen zurückzugeben. Dies ist vor allem ein Problem, wenn Sie erkennen, dass der Kontext, den es läuft, setzt es auf was auch immer der Benutzer will.

Wenn du einen String bekommst, kannst du dich in Dezimal umwandeln, aber das wird entweder auf Nullen angeheftet, um dich zu deiner Genauigkeit zu bringen oder die Rundungseinstellung zu verwenden, um ihn abzuschneiden.

Ihre beste Wette würde wahrscheinlich wetten, sich auf den Punkt in Ihrer Zeichenkette zu zählen und die Anzahl der Zeichen in dem resultierenden Teilstring zu zählen.

Wenn du weißt, dass du keine Parsing-Probleme hast (oder wenn du Python selbst oder eine andere Bibliothek dazu veranlassst, das für dich zu behandeln, hoffe man hoffentlich mit der Lokalisierungsproblematik umzugehen ) … einfach es analysieren und modf verwenden . Der Rückgabewert ist ein Paar von Werten, von denen einer der integrale Teil ist, der andere ist der Bruchteil.

Da Python-Gleitkommazahlen intern als binär und nicht dezimal dargestellt werden, gibt es wirklich keine Abkürzung außer der Umwandlung in Dezimal. Der einzige eingebaute Weg, dies zu tun ist durch die Umwandlung in eine Zeichenfolge. Sie könnten Ihren eigenen Code schreiben, um eine Dezimalumwandlung durchzuführen und die Ziffern zu zählen, aber es wäre eine Verdoppelung der Anstrengung.

Ich brauchte so etwas und ich habe einige davon getestet, die schnellste, die ich herausgefunden habe, war:

 str(number)[::-1].find('.') 

Wegen der Fließkomma-Ausgabe haben alle modulo diejenigen mir auch mit Dezimalzahl (Anzahl) falsche Ergebnisse gegeben (beachten Sie, dass ich dies in einem Skript benötigte, um die Preise eines ganzen db zu reparieren)

 len(str(Decimal(str(number))) % Decimal(1))) - 2 

Die Notwendigkeit, einen String in Dezimal zu setzen ist ziemlich unruhig, wenn wir Schwimmer oder so etwas haben.

Hier ist meine "Bank": https://repl.it/FM8m/17

Der schnellste Weg, den ich für die Ziffern nach dem Dezimalpunkt gefunden habe und die Zahl umrundet ist

Ziffern berechnen:

 a=decimal.Decimal('56.9554362669143476'); lenstr = len(str(a).split(".")[1]) 

Calc, Scheck und Rundung:

 a=decimal.Decimal('56.9554362669143476'); a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a) 

Vergleich:

 $ python2 -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); round(float(a),5) if a.as_tuple().exponent < -5 else float(a)' 10000 loops, best of 3: 32.4 usec per loop $ python -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)' 100000 loops, best of 3: 16.7 usec per loop 
  • Hinzufügen von Backslashs ohne Flucht [Python]
  • So entfernen Sie führende Unterstriche und Zahlen in einer Zeichenfolge in Python
  • Pandas - Prüfen Sie, ob eine String-Spalte ein Paar Strings enthält
  • Hübsches Drucken von Zeilen in einem String in einem Pandas DataFrame
  • Python, wie man Währungszeichenfolge formatiert
  • Qpython Unicode Strings
  • Kann nicht raw_input erhalten, um eine Zahl zurückzugeben
  • Python Kombinieren von Strings in die kürzestmögliche Saite?
  • Ausgabe mit 'StringVar' im Python-Programm
  • Pandas ersetzen (löschen) verschiedene Zeichen aus Strings
  • Wie erstelle ich Zeichen-Arrays in numpy?
  • Python ist die beste Programmiersprache der Welt.