Ich habe etwas über den //
Operator in Python herausgefunden, der in Python 3 mit Floor dividiert.
Gibt es einen Operator, der stattdessen mit Ceil teilt? (Ich kenne den /
Operator, der in Python 3 eine Gleitkommadivision durchführt.)
python
python-3.x
Cradam
quelle
quelle
Antworten:
Es gibt keinen Operator, der mit Ceil teilt. Sie müssen
import math
und verwendenmath.ceil
quelle
Sie können einfach eine verkehrte Bodenteilung durchführen:
Dies funktioniert, weil der Division-Operator von Python die Floor-Division durchführt (im Gegensatz zu C, wo die Integer-Division den Bruchteil abschneidet).
Dies funktioniert auch mit den großen Ganzzahlen von Python, da keine (verlustbehaftete) Gleitkommakonvertierung erfolgt.
Hier ist eine Demonstration:
quelle
int
dies nicht tut (naja, keine aussagekräftigen; bei 64-Bit-Python sind Sie auf Bitnummern beschränkt30 * (2**63 - 1)
), und selbst das vorübergehende Konvertieren infloat
kann zu Informationsverlust führen. Vergleichemath.ceil((1 << 128) / 10)
mit-(-(1 << 128) // 10)
.Sie tun können ,
(x + (d-1)) // d
wenn Teilungx
durchd
, dh(x + 4) // 5
.quelle
math.ceil()
.sys.float_info.max
und es erfordert keinen Import.Lösung 1: Konvertieren Sie den Boden zur Decke mit Negation
Erinnert an den Penn & Teller-Levitationstrick , stellt dies "die Welt auf den Kopf (mit Negation), verwendet eine einfache Bodenteilung (wo Decke und Boden vertauscht wurden) und dreht dann die Welt mit der rechten Seite nach oben (wieder mit Negation). ""
Lösung 2: Lassen Sie divmod () die Arbeit machen
Die Funktion divmod () gibt
(a // b, a % b)
für ganze Zahlen an (dies kann bei Floats aufgrund eines Rundungsfehlers weniger zuverlässig sein). Der Schritt mitbool(r)
addiert eins zum Quotienten, wenn ein Rest ungleich Null vorliegt.Lösung 3: Stellen Sie den Zähler vor der Division ein
Verschieben Sie den Zähler nach oben, sodass die Bodenteilung auf die vorgesehene Decke abgerundet wird. Beachten Sie, dass dies nur für Ganzzahlen funktioniert.
Lösung 4: In float konvertieren, um math.ceil () zu verwenden
Der Code math.ceil () ist leicht zu verstehen, wird jedoch von Ints in Floats und zurück konvertiert. Dies ist nicht sehr schnell und kann zu Rundungsproblemen führen. Außerdem stützt es sich auf die Python 3-Semantik, bei der "true Division" einen Float erzeugt und bei der die Funktion lid () eine Ganzzahl zurückgibt.
quelle
-(-a // b)
o_OSie können es auch immer einfach inline tun
In Python3 ist dies nur eine Größenordnung schneller als das Erzwingen der Float-Division und das Aufrufen von Ceil (), vorausgesetzt, Sie kümmern sich um die Geschwindigkeit. Was Sie nicht sollten, es sei denn, Sie haben durch die Verwendung bewiesen, dass Sie müssen.
quelle
number=100000000
). Bei einem einzelnen Anruf ist der Unterschied ziemlich unbedeutend.foo = -8
undbar = -4
zum Beispiel sollte die Antwort 2 sein, nicht 3, genau wie-8 // -4
. Die Python-Bodenteilung ist definiert als "die mathematische Division mit der auf das Ergebnis angewendeten 'Boden'-Funktion", und die Deckenteilung ist dasselbe, jedoch mitceil()
stattfloor()
.Beachten Sie, dass math.ceil auf 53 Bit Genauigkeit beschränkt ist. Wenn Sie mit großen Ganzzahlen arbeiten, erhalten Sie möglicherweise keine genauen Ergebnisse.
Die Bibliothek gmpy2 bietet eine
c_div
Funktion, die die Deckenrundung verwendet.Haftungsausschluss: Ich pflege gmpy2.
quelle
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'
(sowie zu ersetzenpython3
) BEIDE sindTrue
Einfache Lösung: a // b + 1
quelle