Dieses Problem bringt mich um. Wie rundet man eine Zahl UP in Python auf?
Ich habe versucht, die Zahl abzurunden, aber es hat die Zahl abgerundet. Beispiel:
round(2.3) = 2.0 and not 3, what I would like
Das habe ich versucht int (Nummer + .5) aber es rundet die Nummer wieder ab! Beispiel:
int(2.3 + .5) = 2
Dann habe ich es mit Runde (Nummer + .5) versucht, aber in Randfällen funktioniert es nicht. Beispiel:
WAIT! THIS WORKED!
Bitte beraten.
python
floating-point
integer
rounding
python-2.x
bodacydo
quelle
quelle
round(number + .5)
funktioniert nicht, wenn die Zahl eine Ganzzahl ist.round(3+.5) == 4
, wenn du eigentlich willst3
.Antworten:
Die Deckenfunktion :
quelle
int(math.ceil(363))
math.ceil
ein tatsächliches ganzzahliges Objekt zurück, nicht nur ein schwebendes Objekt mit einem ganzzahligen Wert.10000000 * 0.00136 = 13600.000000000002
Decke stark ansteigen kannmath.ceil(10000000 * 0.00136) = 13601.0
Ich weiß, dass diese Antwort für eine Frage von vor einiger Zeit ist, aber wenn Sie keine Mathematik importieren und nur aufrunden möchten, funktioniert dies für mich.
Der erste Teil wird zu 4 und der zweite Teil wird mit "True" bewertet, wenn ein Rest vorhanden ist, der zusätzlich True = 1 ist. False = 0. Wenn also kein Rest vorhanden ist, bleibt die gleiche Ganzzahl erhalten, aber wenn ein Rest vorhanden ist, wird 1 hinzugefügt.
quelle
//
für die Ganzzahldivision verwenden, so dass dies wird21 // 5 + (21 % 5 > 0)
.float
s. Nett.Interessantes Python 2.x-Problem:
Das Problem ist, dass das Teilen von zwei Ints in Python ein weiteres Int erzeugt und dieses vor dem Deckenaufruf abgeschnitten wird. Sie müssen einen Wert als Float (oder Cast) festlegen, um ein korrektes Ergebnis zu erhalten.
In Javascript führt genau derselbe Code zu einem anderen Ergebnis:
quelle
Wenn Sie mit ganzen Zahlen arbeiten, besteht eine Möglichkeit zum Aufrunden darin, die Tatsache auszunutzen, dass abgerundet wird
//
: Teilen Sie einfach die negative Zahl und negieren Sie dann die Antwort. Kein Import, Gleitkomma oder Bedingung erforderlich.Zum Beispiel:
quelle
(num + den - 1) // den
, was fürint
Eingaben mit positiven Nennern in Ordnung ist , aber fehlschlägt, wenn auch nur ein einziges Nicht-Integralfloat
beteiligt ist (entweder Zähler oder Nenner); Dies sieht magischer aus, funktioniert aber sowohl fürint
s als auch fürfloat
s. Für kleine Zähler ist es auch schneller (unter CPython 3.7.2). Seltsamerweise ist Ihr Ansatz langsamer, wenn nur der Zähler groß genug ist, um Array-basierte Mathematik zu benötigen. nicht klar, warum dies so ist, da die Teilungsarbeit ähnlich sein sollte und zwei unäre Negationen billiger sein sollten als Addition + Subtraktion.Das könnte dir auch gefallen:
Ich sage nicht, dass es besser ist als Mathe, aber wenn Sie numpy bereits für andere Zwecke verwendet haben, können Sie Ihren Code konsistent halten.
Jedenfalls nur ein Detail, auf das ich gestoßen bin. Ich benutze viel Numpy und war überrascht, dass es nicht erwähnt wurde, aber natürlich funktioniert die akzeptierte Antwort einwandfrei.
quelle
Verwenden Sie
math.ceil
zum Aufrunden:HINWEIS : Der Eingang sollte float sein.
Wenn Sie eine Ganzzahl benötigen, rufen Sie diese
int
auf, um sie zu konvertieren:Übrigens, verwenden Sie
math.floor
, um abzurunden undround
auf die nächste ganze Zahl zu runden.quelle
ceil()
wird sich internDie Syntax ist möglicherweise nicht so pythonisch, wie man es gerne hätte, aber es ist eine leistungsstarke Bibliothek.
https://docs.python.org/2/library/decimal.html
quelle
Ich bin überrascht, dass niemand vorgeschlagen hat
für ganzzahlige Division mit Aufrundung. War früher der übliche Weg für C / C ++ / CUDA (vgl.
divup
)quelle
1
anstatt ihn zu subtrahieren, oder die Vorzeichen von Zähler und Nenner umdrehen, bevor Sie die Mathematik durchführen.Stellen Sie sicher, dass der gerundete Wert schwebend sein sollte
aber
quelle
Versuche dies:
quelle
((int(a) - a) != 0)
Ausdruck wird1
immer dann zurückgegebena
, wenn er aufgerundet werden muss. Vielleicht möchten Sie Ihre Antwort erweitern und erklären, wie dies funktioniert.Diese Funktion erfordert keine Module.
quelle
3
, dann würde es4
Die obigen Antworten sind richtig, aber das Importieren des
math
Moduls nur für diese eine Funktion fühlt sich für mich normalerweise wie ein Overkill an. Zum Glück gibt es noch einen anderen Weg:True
undFalse
werden als1
und0
in einer Anweisung mit Zahlen in Python interpretiert .g.is_interger()
im Grunde übersetzt zug.has_no_decimal()
oderg == int(g)
. So lautet die letzte Aussage auf Englischround g down and add one if g has decimal
.quelle
int(g) + (g % 1 > 0)
stattdessen verwenden ;-)from math import ceil
scheint das Importieren des gesamten Mathematikmoduls zu beheben :)import math
von dem, was hinter den Kulissen passiert. Es werden nur alle Symbole außer gelöschtceil
.Ohne Mathematik zu importieren // mit grundlegender Umgebung:
a) Methode / Klassenmethode
b) Lambda:
quelle
Für diejenigen, die aufrunden
a / b
und eine ganze Zahl erhalten möchten :Eine andere Variante mit ganzzahliger Division ist
quelle
Falls jemand auf eine bestimmte Dezimalstelle aufrunden möchte:
quelle
Ich bin überrascht
round(x + 0.4999)
, dass ich diese Antwort noch nicht gesehen habe , also werde ich sie ablegen. Beachten Sie, dass dies mit jeder Python-Version funktioniert. Änderungen am Python-Rundungsschema haben die Sache schwierig gemacht. Siehe diesen Beitrag .Ohne zu importieren, benutze ich:
Warum das so ist
Aus den Dokumenten
Daher wird 2,5 auf 2 und 3,5 auf 4 gerundet. Wenn dies nicht der Fall wäre, könnte das Aufrunden durch Hinzufügen von 0,5 erfolgen, aber wir möchten vermeiden, auf den halben Punkt zu gelangen. Wenn Sie also 0,4999 hinzufügen, werden Sie nah dran sein, aber mit genügend Spielraum, um auf das gerundet zu werden, was Sie normalerweise erwarten würden. Dies wird natürlich fehlschlagen, wenn das
x + 0.4999
gleich ist[n].5000
, aber das ist unwahrscheinlich.quelle
math.ceil()
.Without importing I use:
. Ich habe auch erwähnt, dass es fehlschlagen wird, wenn dasx + 0.4999
gleich ist[n].5000
.math
Modulmath.ceil()
befindet sich in der Standardbibliothek und ist somit für alle praktischen Zwecke überall verfügbar, ohne dass zusätzliche Informationen installiert werden müssen. Und in Bezug auf Ihre Erwähnung, wann es fehlschlägt, ist dies in Ihrer Antwort unvollständig, da es für ein ganzes Intervall fehlschlägt, nicht nur für einen einzelnen Punkt. Technisch könnte man argumentieren, dass man richtig ist, wie man sagt, wenn und nicht wenn , aber es wird den Eindruck beim Gelegenheitsleser erwecken, dass es weniger wahrscheinlich ist als es wirklich ist.So machen Sie es ohne Import:
quelle
Ich weiß, dass dies schon eine ganze Weile her ist, aber ich habe eine ziemlich interessante Antwort gefunden.
Dies behebt die Kantenfälle und funktioniert sowohl für positive als auch für negative Zahlen. Es ist kein Funktionsimport erforderlich
Prost
quelle
-round(-x-0.3) = x
Wenn Sie 4500/1000 in Python betreiben, ist das Ergebnis 4, da für das Standard-Python-Asume als Ganzzahl das Ergebnis logisch lautet: 4500/1000 = 4,5 -> int (4,5) = 4 und die Obergrenze von 4 ist offensichtlich 4
Bei Verwendung von 4500 / 1000.0 beträgt das Ergebnis 4,5 und die Obergrenze 4,5 -> 5
Wenn Sie Javascript verwenden, erhalten Sie 4.5 als Ergebnis von 4500/1000, da Javascript nur das Ergebnis als "numerischen Typ" annimmt und ein Ergebnis direkt als float zurückgibt
Viel Glück!!
quelle
/
immer zu einem Float, also4500/1000
immer zu 4,5.Wenn Sie nichts importieren möchten, können Sie jederzeit Ihre eigene einfache Funktion schreiben als:
def RoundUP(num): if num== int(num): return num return int(num + 1)
quelle
Sie können Floor Devision verwenden und 1 hinzufügen. 2,3 // 2 + 1
quelle
ceil()
anstatt seltsam das Gegenteil zu tun und dann zu kompensierenfrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Ich denke, Sie verwechseln die Arbeitsmechanismen zwischen
int()
undround()
.int()
schneidet die Dezimalzahlen immer ab, wenn eine schwebende Zahl angegeben wird; wohingegenround()
im Fall ,2.5
wo2
und3
sind beide in gleichem Abstand von2.5
, Python kehrt je nachdem , was das ist mehr entfernt von dem 0 - Punkt.quelle
2.3
verwandelt wird3
, was in keinem Ihrer Beispiele vorkommt.Mein Anteil
Ich habe getestet
print(-(-101 // 5)) = 21
das obige Beispiel oben .Nun zur Zusammenfassung:
Ich kann nicht verwenden,
**
also verteile ich die Multiplikation auf Division:quelle
Ich bin im Grunde ein Anfänger bei Python, aber wenn Sie nur versuchen, aufzurunden statt abzurunden, warum nicht:
quelle
round(integer + 0.5)
Das ist was ich oft mache