Ich habe versucht, lange Float-Zahlen zu runden wie:
32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...
Bisher ohne Erfolg. Ich habe versucht math.ceil(x)
, math.floor(x)
(obwohl das aufrunden würde oder nach unten, was nicht ist , was ich suche) und round(x)
die nicht funktioniert entweder (noch Zahlen schwimmen).
Was könnte ich tuen?
EDIT: CODE:
for i in widthRange:
for j in heightRange:
r, g, b = rgb_im.getpixel((i, j))
h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
h = h * 360
int(round(h))
print(h)
int(x)
Antworten:
Wird es runden und in eine Ganzzahl ändern
BEARBEITEN:
Sie weisen keiner Variablen int (round (h)) zu. Wenn Sie int (round (h)) aufrufen, wird die Ganzzahl zurückgegeben, es wird jedoch nichts anderes ausgeführt. Sie müssen diese Zeile ändern für:
Zuweisen des neuen Werts zu h
EDIT 2:
Wie @plowman in den Kommentaren sagte,
round()
funktioniert Pythons nicht wie normalerweise erwartet, und das liegt daran, dass die Art und Weise, wie die Zahl als Variable gespeichert wird, normalerweise nicht so ist, wie Sie sie auf dem Bildschirm sehen. Es gibt viele Antworten, die dieses Verhalten erklären:round () scheint nicht richtig zu runden
Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, die in dieser Antwort angegebene Dezimalzahl zu verwenden: https://stackoverflow.com/a/15398691/4345659
Damit diese Antwort ohne Verwendung zusätzlicher Bibliotheken ordnungsgemäß funktioniert, ist es zweckmäßig, eine benutzerdefinierte Rundungsfunktion zu verwenden. Nach vielen Korrekturen habe ich die folgende Lösung gefunden, die, soweit ich sie getestet habe, alle Speicherprobleme vermeidet. Es basiert auf der Verwendung der Zeichenfolgendarstellung, die mit
repr()
(NOTstr()
!) Erhalten wurde . Es sieht hackig aus, aber es war der einzige Weg, alle Fälle zu lösen. Es funktioniert sowohl mit Python2 als auch mit Python3.Tests:
Schließlich wäre die korrigierte Antwort:
EDIT 3:
Tests:
Das Problem hierbei ist, dass die
dec
-te Dezimalstelle 9 sein kann und wenn diedec+1
-te Ziffer> = 5 ist, wird die 9 zu einer 0 und eine 1 sollte zurdec-1
-ten Ziffer übertragen werden.Wenn wir dies berücksichtigen, erhalten wir:
In der Situation , wie oben beschrieben
b = 10
und die vorherigen Version würde nur verkettena
undb
das in einer Verkettung führen würde ,10
wo der Hinter 0 verschwinden würde. Diese Version wirdb
basierend aufdec
einem richtigen Übertrag in die richtige Dezimalstelle umgewandelt .quelle
int(round(4.5))
rundet auf 4 ab, währendint(round(4.500001))
richtig auf 5round(x)
ist dies in Python 3.6.2 (und möglicherweise auch in niedrigeren Versionen) ausreichend. Das Ergebnis ist bereits vom Typ int. Hinweis:round(x, n)
wird vom Typ float sein.Verwenden Sie
round(x, y)
. Es wird Ihre Zahl auf die gewünschte Dezimalstelle aufrunden.Beispielsweise:
quelle
round(value,significantDigit)
ist die gewöhnliche Lösung, funktioniert jedoch nicht so, wie man es aus mathematischer Sicht erwarten würde, wenn runde Werte mit enden5
. Wenn das5
in der Ziffer direkt nach der Ziffer steht, auf die Sie gerundet sind, werden diese Werte nur manchmal wie erwartet aufgerundet (dh es wird8.005
auf zwei Dezimalstellen gerundet8.01
). Für bestimmte Werte werden sie aufgrund der Macken der Gleitkomma-Mathematik stattdessen abgerundet!dh
Seltsam.
Angenommen, Sie beabsichtigen, die traditionelle Rundung für Statistiken in den Wissenschaften durchzuführen, ist dies ein praktischer Wrapper, damit die
round
Funktion wie erwartet funktioniert undimport
zusätzliche Dinge wie erforderlich sindDecimal
.Aha! Auf dieser Grundlage können wir also eine Funktion erstellen ...
Grundsätzlich wird dadurch ein Wert hinzugefügt, der garantiert kleiner ist als die am wenigsten angegebene Ziffer der Zeichenfolge, für die Sie verwenden möchten
round
. Durch Hinzufügen dieser kleinen Menge bleibt dasround
Verhalten in den meisten Fällen erhalten, und jetzt wird sichergestellt, dass die Ziffer, die der gerundeten unterlegen ist, aufgerundet wird5
und ob sie abgerundet wird4
.Der Ansatz der Verwendung
10**(-len(val)-1)
war bewusst, da er die größte kleine Zahl ist, die Sie hinzufügen können, um die Verschiebung zu erzwingen, und gleichzeitig sicherstellt, dass der hinzugefügte Wert die Rundung niemals ändert, selbst wenn die Dezimalstelle.
fehlt. Ich könnte nur10**(-len(val))
mit einer Bedingung verwenden,if (val>1)
um1
mehr zu subtrahieren ... aber es ist einfacher, immer die zu subtrahieren,1
da dies den anwendbaren Bereich von Dezimalzahlen, mit dem diese Problemumgehung richtig umgehen kann, nicht wesentlich ändert. Dieser Ansatz schlägt fehl, wenn Ihre Werte die Grenzen des Typs erreichen. Dies schlägt fehl, aber für fast den gesamten Bereich gültiger Dezimalwerte sollte er funktionieren.Sie können auch die Dezimalbibliothek verwenden, um dies zu erreichen. Der von mir vorgeschlagene Wrapper ist jedoch einfacher und kann in einigen Fällen bevorzugt werden.
Bearbeiten: Vielen Dank an Blckknght für den Hinweis, dass der Randfall
5
nur für bestimmte Werte auftritt. Auch eine frühere Version dieser Antwort war nicht explizit genug, dass das ungerade Rundungsverhalten nur auftritt, wenn die Ziffer, die der Ziffer, auf die Sie runden, unmittelbar unterlegen ist, eine hat5
.quelle
5
ihrer letzten Ziffer immer abgerundet werden. Das ist nicht der Fall in einem Schnelltest Ich habe gerade mit Zahlen wie1.5
,2.5
,3.5
und so weiter und1.05
,1.15
,1.25
,1.35
auf eine Dezimalstelle gerundet wird . Der erste Satz (exakte Hälften, die auf kleine ganze Zahlen gerundet werden) rundet immer auf eine gerade ganze Zahl. Letztere runden nicht konsistent, wahrscheinlich aufgrund ungenauer binärer Darstellungen einiger Werte. Die Floats mit exakten binären Darstellungen wie "1.25
rund" haben eine noch am wenigsten signifikante Ziffer, die anderen scheinen jedoch zufällig zu runden.round(4.0005,3)
gibt4.0
undround(1.0005,3)
gibt1.0
, aberround(2.0005,3)
gibt2.001
undround(3.0005,3)
gibt3.001
. Aber genau deshalb ist meine vorgeschlagene Lösung notwendig ... Sie wissen nicht, was Sie in diesem wichtigen Fall von der Aktienrunde erwarten können!, digits
am Ende dieser Rückgabeerklärung haben? Kein Wortspiel beabsichtigt. ( meine ich meine)Versuchen Sie es mit positiven Ergebnissen
Versuchen Sie es, damit es auch für Negative funktioniert
int()
funktioniert wie eine Bodenfunktion und daher können Sie diese Eigenschaft ausnutzen. Dies ist definitiv der schnellste Weg.quelle
>>> x=-0.999
>>> int(x), round(x), int(x+0.5)
(0, -1.0, 0)
Macht Python nicht nur die Hälfte bis gerade , wie es IEEE 754 vorschreibt ?
Seien Sie vorsichtig bei der Neudefinition oder bei der Verwendung von "nicht standardmäßigen" Rundungen.
(Siehe auch https://stackoverflow.com/a/33019948/109839 )
quelle
Round half to even
wird von IEEE 754 absolut nicht vorgeschrieben, sondern ist nur eine von mehreren Rundungsoptionen, die in der Norm beschrieben sind .Round to nearest, ties away from zero
(dh das Verhalten, das die meisten Leute erwarten) ist ebenfalls eine Option und die Standardeinstellung in beispielsweise C / C ++.round
erklärt wird) und dies gemäß der vorgeschriebenen Art und Weise, wie "die Hälfte auf gerade runden" vorgeschrieben ist nach dem Standard arbeiten (oder beschrieben).Sie können auch numpy verwenden, vorausgesetzt, Sie verwenden python3.x. Hier ist ein Beispiel
quelle
Ihre Lösung ruft rund auf, ohne das zweite Argument anzugeben (Anzahl der Dezimalstellen).
Das ist ein viel besseres Ergebnis als
Aus der Python-Dokumentation unter https://docs.python.org/3/library/functions.html#round
quelle
Wenn Sie (zum Beispiel) eine zweistellige Näherung für A
int(A*100+0.5)/100.0
benötigen , tun Sie, wonach Sie suchen.Wenn Sie eine dreistellige Näherung benötigen, multiplizieren und dividieren Sie durch 1000 und so weiter.
quelle
So etwas sollte auch funktionieren
quelle
Zu diesem Zweck würde ich vorschlagen, nur Folgendes zu tun:
Dies gibt Ihnen die nächste Ganzzahl.
Hoffe das hilft!!
quelle
Ich verwende und kann die folgende Lösung empfehlen (python3.6):
Es funktioniert gut für Halbzahlen (Positive und Negative) und funktioniert sogar schneller als int (Runde (x)):
quelle