int(round(x))
Sẽ làm tròn nó và thay đổi nó thành số nguyên
BIÊN TẬP:
Bạn không gán int (round (h)) cho bất kỳ biến nào. Khi bạn gọi int (round (h)), nó sẽ trả về số nguyên nhưng không làm gì khác; bạn phải thay đổi dòng đó cho:
h = int(round(h))
Để gán giá trị mới cho h
EDIT 2:
Như @plowman đã nói trong các bình luận, Python round()
không hoạt động như mọi người thường mong đợi và đó là vì cách số được lưu trữ dưới dạng một biến thường không phải là cách bạn nhìn thấy trên màn hình. Có rất nhiều câu trả lời giải thích cho hành vi này:
round () dường như không được làm tròn đúng
Một cách để tránh vấn đề này là sử dụng Thập phân như được nêu trong câu trả lời này: https://stackoverflow.com/a/15398691/4345659
Để câu trả lời này hoạt động chính xác mà không cần sử dụng các thư viện bổ sung, sẽ thuận tiện khi sử dụng chức năng làm tròn tùy chỉnh. Sau rất nhiều lần sửa chữa, tôi đã đưa ra giải pháp sau đây, theo như tôi đã thử nghiệm thì tránh được tất cả các vấn đề lưu trữ. Nó dựa trên việc sử dụng biểu diễn chuỗi, thu được bằng repr()
(KHÔNG str()
!). Có vẻ hacky nhưng đó là cách duy nhất tôi tìm thấy để giải quyết tất cả các trường hợp. Nó hoạt động với cả Python2 và 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])
Các xét nghiệm:
>>> 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
Cuối cùng, câu trả lời đúng sẽ là:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
Các xét nghiệm:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Gotcha ở đây là dec
số thập phân -th có thể là 9 và nếu dec+1
chữ số -th> = 5 thì số 9 sẽ trở thành số 0 và số 1 phải được chuyển sang dec-1
chữ số -th.
Nếu chúng ta cân nhắc điều này, chúng ta sẽ nhận được:
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])
Trong tình huống được mô tả ở trên b = 10
và phiên bản trước sẽ chỉ ghép nối a
và b
điều đó sẽ dẫn đến kết nối 10
nơi dấu 0 sẽ biến mất. Phiên bản này biến đổi b
sang vị trí thập phân bên phải dựa trên dec
, như một thực hiện đúng.
int(x)