python Decimal - prüfen ob integer
Ich bin mit dem Dezimal-Bibliothek in Python, und drucken Sie die Werte mit
format(value, 'f')
, wo Wert ist ein Decimal
. Bekomme ich zahlen in der form 10.00000
wiedergibt, welche die Genauigkeit der Nachkommastellen. Ich weiß, dass float
unterstützt is_integer
, aber es scheint ein Mangel an eine ähnliche API für Dezimalzahlen. Ich Frage mich, ob es war ein Weg, um dieses.
InformationsquelleAutor Pradyot | 2013-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mit der modulo-operation, um zu überprüfen, ob es eine nicht-ganzzahlige Rest:
decimal.InvalidOperation: quotient too large in //, % or divmod
InformationsquelleAutor poke
Versuchen
math.floor(val) == val
oderval == int(val)
.int
Vorschlag ist gut.math.floor
ist eine schlechte Wahl, weil es stützt sich auf Wagen, die nicht exakt darstellen Dezimalzahlen. Und Sie haben sogar ein Modul importieren, nur um diese ungenaue Ergebnis.Ja, jetzt, da ich daran denke die Mathe-version ist nicht die beste Idee. Ich hatte gerade fertig geschrieben, einige Mathe-intensiv-JavaScript wenn ich schrieb, die Antwort, so der js Math-Objekt war immer noch fest in meinem Gehirn.
Mit int(val) erfolgreich.
InformationsquelleAutor willy
Decimal hat eine "versteckte" Methode genannt _isinteger (), der Art des wie der Schwimmer ist is_integer () - Methode:
Wie Sie sehen können, würden Sie haben zu fangen Sie eine Ausnahme, wenn. Alternativ, Sie könnte machen Sie den test auf dem Wert, BEVOR Sie übergeben das Dezimalformat mit Hilfe der float-Methode, wie Sie bereits erwähnt oder mit isinstance.
Yeah, ich bekomme einen traceback zu müssen, konvertieren Sie die float in einen string, wenn ich das mache. Nicht sicher, warum das implementiert ist, Weg.
Ab Python 2.7, Decimal-Instanzen konstruiert werden können, die direkt von Schwimmern.
Der führende Unterstrich bedeutet, es ist eine private Methode, also ich glaube nicht, verwenden Sie es draußen sein würde, als pythonic...
Python 3.6:
AttributeError: 'decimal.Decimal' object has no attribute '_isinteger'
InformationsquelleAutor Mike Driscoll
Die mathematische Lösung ist, konvertieren Sie Ihre dezimale Zahl in eine Ganzzahl und dann testen Sie die Gleichheit mit Ihr an der Reihe.
Seit
Decimal
kann eine beliebige Präzision, sollten Sie nicht konvertieren es zuint
oderfloat
.Glücklicherweise
Decimal
Klasse hat eineto_integral_value
die die Konvertierung für Sie. Können Sie nehmen eine Lösung wie diese:Beispiel:
Finden Sie unter: http://docs.python.org/2/library/decimal.html#decimal.Decimal.to_integral_value
Decimal
Wert auf ganze Zahl ist richtig... aber warum kannst du nicht verwendenint
? Python transparent verwendet beliebige Genauigkeit ganze zahlen als notwendig.Ja, Sie können zu konvertieren arbritrary-precision-integer, aber ich bin nicht sicher, es ist effizienter als die Verwendung von
to_integral_value()
.Sie hat nicht erwähnt nichts über die Effizienz. Sie sagte
int
wäre nicht in der Lage, es zu handhaben. Bis es gezeigt, dassint
ist zu langsam der Lösung, es gibt keinen Grund, um etwas komplizierter.Übrigens, auf meinem Rechner
int
ist schneller alsto_integral_value
.InformationsquelleAutor Laurent LAPORTE