int(round(x))
Округлить його та змініть на ціле число
Редагувати:
Ви не присвоюєте int (round (h)) жодній змінній. Коли ви викликаєте int (круглий (h)), він повертає ціле число, але нічого іншого не робить; ви повинні змінити цей рядок для:
h = int(round(h))
Призначити нове значення h
EDIT 2:
Як сказав @plowman в коментарях, Python round()не працює так, як зазвичай можна було очікувати, і це тому, що спосіб збереження числа у вигляді змінної зазвичай не такий, як ви його бачите на екрані. Є багато відповідей, які пояснюють таку поведінку:
здається, що круглий () не відповідає округленню
Один із способів уникнути цієї проблеми - використовувати десятковий знак, зазначений у цій відповіді: https://stackoverflow.com/a/15398691/4345659
Для того, щоб ця відповідь справно працювала без використання додаткових бібліотек, було б зручно користуватися спеціальною функцією округлення. Після численних виправлень я придумав таке рішення, що, наскільки я тестував, уникав усіх проблем із зберіганням. Він заснований на використанні рядкового подання, отриманого за допомогою repr()(НЕ str()!). Це виглядає хакі, але це був єдиний спосіб, коли я знайшов вирішити всі справи. Він працює як з Python2, так і з 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])
Тести:
>>> 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
Нарешті, виправлена відповідь буде:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Тести:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Тут є те, що decдесяткова десяткова dec+1цифра може бути 9, а якщо -та цифра> = 5, то 9 стане 0, а 1-й слід переносити до dec-1-ої цифри.
Якщо ми врахуємо це, то отримаємо:
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])
У вищеописаній ситуації b = 10та попередня версія буде просто об'єднана, aі bце призведе до конкатенації того місця, 10де пропадає 0. Ця версія перетворюється bна правильний десяткове місце на основі dec, як належне перенесення.
int(x)