int(round(x))
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:
h = int(round(h))
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()
(NOT str()
!) 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.
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
return float(num[:-1])
Tests:
>>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>>
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0
Schließlich wäre die korrigierte Antwort:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Tests:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Das Problem hierbei ist, dass die dec
-te Dezimalstelle 9 sein kann und wenn die dec+1
-te Ziffer> = 5 ist, wird die 9 zu einer 0 und eine 1 sollte zur dec-1
-ten Ziffer übertragen werden.
Wenn wir dies berücksichtigen, erhalten wir:
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
a = num[:-2-(not dec)] # integer part
b = int(num[-2-(not dec)])+1 # decimal part
return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
return float(num[:-1])
In der Situation , wie oben beschrieben b = 10
und die vorherigen Version würde nur verketten a
und b
das in einer Verkettung führen würde , 10
wo der Hinter 0 verschwinden würde. Diese Version wird b
basierend auf dec
einem richtigen Übertrag in die richtige Dezimalstelle umgewandelt .
int(x)