Wie der Titel schon sagt, möchte ich eine Gleitkommazahl auf die nächste Ganzzahl abrunden. Wenn es jedoch kein Ganzes ist, möchte ich die Variable IMMER abrunden, unabhängig davon, wie nahe sie an der nächsten Ganzzahl liegt. Gibt es eine Möglichkeit, dies zu tun?
python
floating-point
integer
rounding
Anthony Perez
quelle
quelle
Antworten:
Einfach
wird auch funktionieren.
quelle
int(-23.3) == 23
Eines davon sollte funktionieren:
quelle
math.trunc
ist eine Ganzzahl, während die Ausgabe vonmath.floor
ein Float ist.type(math.floor(1.51)) -> int
undtype(math.trunc(1.51)) -> int
abpython 3.6.0
Der
//
Bediener gibt das Stockwerk der Abteilung zurück. Da das Teilen durch 1 Ihre Zahl nicht ändert, entspricht dies der Etage, es ist jedoch kein Import erforderlich. Anmerkungen:quelle
int(-1.1) == -1
Während-1.1//1 == -2.0
jedochdecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(wie dokumentiert, Anspruch 2 nicht zutrifftdecimal
),//
ist es auch heute noch nicht vollständig stabil, sich darauf zu verlassen, wie sich das Verhalten verhält.Um ein Gleitkommaergebnis zu erhalten, verwenden Sie einfach:
Es funktioniert auch für negative Zahlen.
quelle
Ich denke, Sie brauchen eine Bodenfunktion:
math.floor (x)
quelle
Viele Leute sagen zu verwenden
int(x)
, und dies funktioniert in den meisten Fällen in Ordnung, aber es gibt ein kleines Problem. Wenn das Ergebnis von OP ist:es wird zu runden
nach dem 16. 9 wird es rund. Dies ist keine große Sache, wenn Sie sicher sind, dass Sie so etwas nie finden werden. Aber es ist etwas zu beachten.
quelle
1.9999999999999999
es tatsächlich gleich2.0
in der internen float64-Darstellung ist. I. e. Es wird bereits gerundet, sobald es in einen Float analysiert wird, da ein 64-Bit-Float nicht so viele signifikante Ziffern darstellen kann. Sie können dies mit der Auswertung überprüfen1.9999999999999999 == 2.0
. Und wenn Sie den Verdacht haben, dass die Operation equals auf Floats etwas rundet, können Sie die binäre Darstellung mit vergleichenstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
, die ebenfalls gleich ist.int()
. Der Wert ist bereits 2.0 und es wird ihn glücklich in 2 umwandeln.int()
, es hat nur mit einer missbräuchlichen Verwendung vonfloat
zu tun , wie1.9999999999999999
es zur2.0
Kompilierungszeit aufgerundet wird (währendint()
es zur Ausführungszeit aufgerufen wird). Wenn Sie den richtigen Datentyp für die Variable verwenden, funktioniert alles wie erwartet:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
gibt1
Wenn Sie keine Mathematik importieren möchten, können Sie Folgendes verwenden:
int(round(x))
Hier ist eine Dokumentation:
quelle
round
wurde bereits als Antwort diskutiert und abgelehnt, als diese Frage vor einem Jahr gestellt wurde. OP willmath.floor
.Wenn Sie mit numpy arbeiten, können Sie die folgende Lösung verwenden, die auch mit negativen Zahlen funktioniert (sie funktioniert auch mit Arrays).
Ich denke, es wird auch funktionieren, wenn Sie nur das
math
Modul anstelle desnumpy
Moduls verwenden.quelle
Ich weiß nicht, ob Sie das gelöst haben, aber ich stolpere nur über diese Frage. Wenn Sie Dezimalstellen entfernen möchten, können Sie int (x) verwenden, um alle Dezimalstellen zu entfernen. Es ist nicht erforderlich, rund (x) zu verwenden.
quelle
Machen Sie einfach rund (x-0,5). Dies gibt immer den nächsten abgerundeten Integer-Wert Ihres Floats zurück. Sie können auch einfach durch Runden aufrunden (x + 0,5).
quelle
Es mag sehr einfach sein, aber könnten Sie es dann nicht einfach auf minus 1 aufrunden? Beispielsweise:
quelle
integer
.Ich habe diesen Code verwendet, bei dem Sie 0,5 von der Zahl abziehen und wenn Sie ihn runden, ist es die abgerundete ursprüngliche Zahl.
quelle