int(round(x))
Yuvarlar ve tamsayı olarak değiştirir
DÜZENLE:
Hiçbir değişkene int (round (h)) atamıyorsunuz. İnt (round (h)) öğesini çağırdığınızda, tam sayı değerini döndürür ancak başka bir şey yapmaz; bu satırı şu şekilde değiştirmeniz gerekir:
h = int(round(h))
Yeni değeri h değerine atamak için
DÜZENLEME 2:
@Plowman'ın yorumlarda söylediği gibi, Python'lar round()normalde beklendiği gibi çalışmaz ve bunun nedeni sayının bir değişken olarak depolanma biçiminin genellikle ekranda gördüğünüz gibi olmamasıdır. Bu davranışı açıklayan birçok cevap vardır:
round () düzgün yuvarlanmıyor gibi görünüyor
Bu sorunu önlemenin bir yolu, şu cevapta belirtildiği şekilde Ondalık değerini kullanmaktır: https://stackoverflow.com/a/15398691/4345659
Bu cevabın ekstra kütüphane kullanmadan düzgün çalışması için özel bir yuvarlama fonksiyonu kullanmak uygun olacaktır. Birçok düzeltmeden sonra, test ettiğim kadarıyla tüm depolama sorunlarından kaçınan aşağıdaki çözümü buldum. repr()(NOT str()!) İle elde edilen dize temsilini kullanmaya dayanır . Keskin görünüyor ama tüm davaları çözmenin tek yolu buydu. Hem Python2 hem de Python3 ile çalışır.
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])
Testler:
>>> 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
Son olarak, düzeltilmiş cevap:
# Having proper_round defined as previously stated
h = int(proper_round(h))
DÜZENLEME 3:
Testler:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Buradaki gotcha, decondalık ondalık sayı 9 olabilir ve eğer dec+1sayı basamağı> = 5 ise, sayı 0 olur ve dec-1sayı basamağa bir 1 taşınmalıdır .
Bunu dikkate alırsak:
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])
Yukarıda tarif edilen durumda b = 10ve önceki versiyon sadece bir araya gelecek ave bbu 10da takip eden 0'ın nerede kaybolacağı bir birleşme ile sonuçlanacaktır . Bu sürüm uygun bir taşıma olarak bdoğru ondalık basamağa dönüşür dec.
int(x)