2015-08-04 16 views
90

Ich habe wie lange Float-Zahlen abzurunden versucht:Runde Nummer nächste ganze Zahl

32.268907563; 
32.268907563; 
31.2396694215; 
33.6206896552; 
... 

ohne Erfolg bisher. Ich probierte math.ceil(x), math.floor(x) (obwohl das rund oder nach oben abgerundet würde, was nicht das ist, was ich suche) und round(x), die auch nicht funktionierten (immernoch Gleitkommazahlen).

Was könnte ich tun?

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) 
+1

Ich würde versuchen, 'int (x)' –

Antwort

139
int(round(x)) 

Wird es abzurunden und es

EDIT auf ganzzahlige ändern:

Sie sind nicht int (rund (h)) für jede Variable zuweisen . Wenn Sie int (round (h)) aufrufen, gibt es die ganze Zahl zurück, tut aber nichts anderes; Sie müssen für diese Zeile ändern:

h = int(round(h)) 

Um den neuen Wert h

+0

print ("4.5)", int (round (4.5))) # gab mir 4 print ("5.5)", int (Runde (5.5))) # gab mir 6:, ( – Komm

+0

Es ist mit der Python-Version verwandt. Es gibt mir 5 und 6 mit Python 2.7.9 und, wie du gesagt hast, 4 und 6 mit Python 3.4.2 –

+0

Hmm .... es wäre schön, wenn die runde Funktion nicht konvertiert ints in floats – user48956

14

Verwendung round(x, y) zuweisen. Es wird Ihre Nummer bis zur gewünschten Dezimalstelle aufgerundet.

Zum Beispiel:

>>> round(32.268907563, 3) 
32.269 
8

round(value,significantDigit) ist die gewöhnliche Lösung, aber dies funktioniert nicht wie man sich von einer mathematischen Perspektive erwarten würde, wenn runde Werte in 5 enden. Wenn der Wert 5 in der Zahl unmittelbar hinter der Zahl liegt, auf die Sie gerundet werden, werden diese Werte nur manchmal wie erwartet aufgerundet (d. H. 8.005, das Runden auf zwei Dezimalziffern ergibt 8.01). Für bestimmte Werte aufgrund der Eigenarten der Fließkomma-Mathematik werden sie stattdessen abgerundet!

d.h.

>>> round(1.0005,3) 
1.0 
>>> round(2.0005,3) 
2.001 
>>> round(3.0005,3) 
3.001 
>>> round(4.0005,3) 
4.0 
>>> round(1.005,2) 
1.0 
>>> round(5.005,2) 
5.0 
>>> round(6.005,2) 
6.0 
>>> round(7.005,2) 
7.0 
>>> round(3.005,2) 
3.0 
>>> round(8.005,2) 
8.01 

Schräge.

Angenommen, Ihre Absicht ist es, die traditionelle Abrundung für die Statistik in den Wissenschaften zu tun, ist dies eine praktische Wrapper arbeiten, um die round Funktion zu erhalten, wie wie Decimal-import Extramaterial zu erwarten zu müssen.

>>> round(0.075,2) 

0.07 

>>> round(0.075+10**(-2*5),2) 

0.08 

Aha! So auf dieser Grundlage wir eine Funktion machen kann ...

def roundTraditional(val,digits): 
    return round(val+10**(-len(str(val))-1)) 

Grundsätzlich fügt dieser Wert garantiert, dass er kleiner ist als der am wenigsten gegeben Ziffer der Zeichenfolge Sie versuchen round auf zu verwenden. Durch das Hinzufügen dieser kleinen Menge wird das Verhalten der round in den meisten Fällen beibehalten, während nun sichergestellt wird, dass die Ziffer, die der abgerundeten Zahl 5 entspricht, rundet und wenn sie 4 ist, rundet sie ab.

Der Ansatz von 10**(-len(val)-1) mit Absicht war, wie es die größte kleine Zahl, die Sie den Übergang zu zwingen hinzufügen können, aber auch, dass der Wert, den Sie nie ändert sich die Rundung auch wenn das Dezimalsystem . fehlt hinzufügen zu gewährleisten. Ich könnte nur 10**(-len(val)) mit einem bedingten if (val>1) verwenden, um 1 zu subtrahieren mehr ... aber es ist einfacher, nur die 1 subtrahieren als das wird nicht viel den anwendbaren Bereich von Dezimalzahlen ändern diese Problemumgehung kann richtig umgehen. Dieser Ansatz wird fehlschlagen, wenn Ihre Werte die Grenzen des Typs erreichen, dies wird fehlschlagen, aber für fast den gesamten Bereich der gültigen Dezimalwerte sollte es funktionieren.

Sie können auch die decimal-Bibliothek verwenden, um dies zu erreichen, aber der von mir vorgeschlagene Wrapper ist einfacher und kann in einigen Fällen bevorzugt werden.


Edit: Dank Blckknght für den Hinweis auf, dass der 5 fringe Fall nur für bestimmte Werte auftritt. Auch eine frühere Version dieser Antwort war nicht explizit genug, dass das ungerade Rundungsverhalten nur dann auftritt, wenn die Stelle, die unmittelbar hinter der Ziffer liegt, auf die Sie gerundet werden, eine 5 hat.

+0

Ich bin mir nicht sicher, warum Sie Dezimalzahlen mit '5' als ihre denken Die letzte Ziffer wird immer abgerundet, was bei einem Schnelltest nicht der Fall ist s wie "1,5", "2,5", "3,5" usw. und "1,05", "1,15", "1,25", "1,35", die auf eine Dezimalstelle gerundet werden. Die erste Menge (exakte Hälften, die auf kleine ganze Zahlen runden) wird immer auf eine gerade ganze Zahl gerundet. Die letztere Menge wird nicht konsistent abgerundet, wahrscheinlich aufgrund von ungenauen binären Darstellungen einiger der Werte. Die Floats, die exakte binäre Repräsentationen wie '1 haben.25 'um eine noch niedrigwertigere Ziffer zu haben, aber die anderen scheinen zufällig zu runden. – Blckknght

+0

Interessant ... Sie haben Recht. 'round (4.0005,3)' ergibt '4.0' und' round (1.0005,3) 'ergibt' 1.0', aber 'round (2.0005.3)' ergibt '2.001' und' round (3.0005.3) 'ergibt' 3.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! –

+0

Danke dafür. Ihre Funktion wird sich als nützlich erweisen, wenn dieses Problem auftritt. – TMWP

5

Für positive Ergebnisse, versuchen

int(x + 0.5) 

Um es auch für Negative funktioniert, versuchen

int(x + (0.5 if x > 0 else -0.5)) 

int() funktioniert wie ein fl oor-Funktion und somit können Sie diese Eigenschaft ausnutzen. Dies ist definitiv der schnellste Weg.

+3

funktioniert nicht für Negative '>>> x = -0.999' ' >>> int (x), rund (x), int (x + 0,5) ' ' (0, -1,0, 0) ' – user2907934

0

Wenn Sie (zum Beispiel) eine zweistellige Näherung für A benötigen, dann wird int(A*100+0.5)/100.0 tun, was Sie suchen.

Wenn Sie eine dreistellige Approximation benötigen, multiplizieren und dividieren Sie sie durch 1000 und so weiter.

1

Sie können auch unter der Annahme verwenden numpy wenn Sie python3.x verwenden hier ein Beispiel

import numpy as np 
x = 2.3 
print(np.rint(x)) 
>>> 2.0 
+0

https://github.com/rbgirshick/py-faster-rcnn/issues/481 –

Verwandte Themen