Frage Python Dezimal - überprüft, ob Ganzzahl


Ich benutze die Decimal-Bibliothek in Python und drucke die Werte mit aus format(value, 'f'), wo der Wert a ist Decimal. Ich bekomme Zahlen in der Form 10.00000, die die Genauigkeit der Dezimalstelle widerspiegelt. ich weiß das float  unterstützt is_integer, aber es scheint einen Mangel an einer ähnlichen API für Dezimalzahlen zu geben. Ich habe mich gefragt, ob es einen Weg gab.


10
2017-11-13 21:45


Ursprung


Antworten:


Sie können die Modulo-Operation verwenden, um zu überprüfen, ob ein nicht ganzzahliger Rest vorhanden ist:

>>> from decimal import Decimal
>>> Decimal('3.14') % 1 == 0
False
>>> Decimal('3') % 1 == 0
True
>>> Decimal('3.0') % 1 == 0
True

19
2017-11-13 21:48



Decimal hat eine "versteckte" Methode namens _isinteger (), die ähnlich funktioniert wie die Methode is_integer () des Floats:

>>> Decimal(1)._isinteger()
True
>>> Decimal(1.1)._isinteger()
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "C:\Python26\Lib\decimal.py", line 649, in __new__
    "First convert the float to a string")
TypeError: Cannot convert float to Decimal.  First convert the float to a string

Wie Sie sehen können, müssten Sie allerdings eine Ausnahme abfangen. Alternativ können Sie den Test für den Wert ausführen, BEVOR Sie ihn an Decimal übergeben, indem Sie die Methode float wie erwähnt oder isinstance verwenden.


5
2017-11-13 21:53



Versuchen math.floor(val) == val oder val == int(val).


4
2017-11-13 21:51



Die mathematische Lösung besteht darin, Ihre Dezimalzahl in eine ganze Zahl zu konvertieren und dann ihre Gleichheit mit Ihrer Zahl zu testen.

Schon seit Decimal kann eine willkürliche Genauigkeit haben, sollten Sie nicht in konvertieren int oder float.

Zum Glück, die DecimalKlasse hat a to_integral_value welche die Umwandlung für dich machen. Sie können eine Lösung wie folgt annehmen:

def is_integer(d):
    return d == d.to_integral_value()

Beispiel:

from decimal import Decimal

d_int = Decimal(3)
assert is_integer(d_int)

d_float = Decimal(3.1415)
assert not is_integer(d_float)

Sehen: http://docs.python.org/2/library/decimal.html#decimal.Decimal.to_integral_value


2
2017-11-13 22:18