int(round(x))
Akan membulatkannya dan mengubahnya menjadi bilangan bulat
EDIT:
Anda tidak memberikan int (putaran (h)) ke variabel apa pun. Saat Anda memanggil int (bulat (h)), ia mengembalikan nomor integer tetapi tidak melakukan hal lain; Anda harus mengubah baris itu untuk:
h = int(round(h))
Untuk menetapkan nilai baru ke h
EDIT 2:
Seperti @plowman katakan dalam komentar, Python round()tidak bekerja seperti yang biasanya diharapkan, dan itu karena cara nomor disimpan sebagai variabel biasanya bukan cara Anda melihatnya di layar. Ada banyak jawaban yang menjelaskan perilaku ini:
round () tampaknya tidak membulatkan dengan benar
Salah satu cara untuk menghindari masalah ini adalah dengan menggunakan Desimal seperti yang dinyatakan oleh jawaban ini: https://stackoverflow.com/a/15398691/4345659
Agar jawaban ini berfungsi dengan baik tanpa menggunakan pustaka tambahan, akan lebih mudah untuk menggunakan fungsi pembulatan khusus. Setelah banyak koreksi, saya datang dengan solusi berikut, yang sejauh ini saya uji menghindari semua masalah penyimpanan. Ini didasarkan pada penggunaan representasi string, yang diperoleh dengan repr()(TIDAK str()!). Kelihatannya berantakan tapi itu satu-satunya cara yang saya temukan untuk menyelesaikan semua kasus. Ia bekerja dengan kedua Python2 dan 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])
Tes:
>>> 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
Akhirnya, jawaban yang diperbaiki adalah:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Tes:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Gotcha di sini adalah bahwa decdesimal -th bisa menjadi 9 dan jika dec+1digit -th> = 5 maka 9 akan menjadi 0 dan 1 harus dibawa ke dec-1digit -th.
Jika kami mempertimbangkan hal ini, kami mendapatkan:
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])
Dalam situasi yang diuraikan di atas b = 10dan versi sebelumnya hanya akan menyatukan adan byang akan menghasilkan rangkaian di 10mana trailing 0 akan menghilang. Versi ini berubah bmenjadi tempat desimal yang tepat berdasarkan dec, sebagai carry yang tepat.
int(x)