Tôi biết rằng các câu hỏi về làm tròn con trăn đã được hỏi nhiều lần rồi, nhưng câu trả lời không giúp tôi. Tôi đang tìm kiếm một phương pháp làm tròn số float lên một nửa và trả về số float. Phương thức cũng nên chấp nhận một tham số xác định vị trí thập phân để làm tròn thành. Tôi đã viết một phương pháp thực hiện kiểu làm tròn này. Tuy nhiên, tôi nghĩ rằng nó trông không thanh lịch chút nào.
def round_half_up(number, dec_places):
s = str(number)
d = decimal.Decimal(s).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
Tôi không thích nó, rằng tôi phải chuyển đổi float thành một chuỗi (để tránh sự thiếu chính xác của dấu phẩy động) và sau đó làm việc với mô-đun thập phân . Bạn có giải pháp nào tốt hơn không?
Chỉnh sửa: Như đã chỉ ra trong các câu trả lời dưới đây, giải pháp cho vấn đề của tôi không rõ ràng vì làm tròn chính xác đòi hỏi phải thể hiện chính xác các số ở vị trí đầu tiên và đây không phải là trường hợp nổi. Vì vậy, tôi mong đợi rằng các mã sau đây
def round_half_up(number, dec_places):
d = decimal.Decimal(number).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
(khác với mã trên chỉ bởi thực tế rằng số lượng phao được trực tiếp chuyển đổi thành số thập phân và không để một chuỗi đầu tiên) để trở về 2.18 khi được sử dụng như thế này: round_half_up(2.175, 2)
Nhưng nó không vì Decimal(2.175)
sẽ trở lại Decimal('2.17499999999999982236431605997495353221893310546875')
, cách phao số được đại diện bởi máy tính. Đáng ngạc nhiên, mã đầu tiên trả về 2,18 vì số float được chuyển đổi thành chuỗi đầu tiên. Có vẻ như hàm str () tiến hành làm tròn ẩn cho số ban đầu có nghĩa là được làm tròn. Vì vậy, có hai vòng diễn ra. Mặc dù đây là kết quả mà tôi mong đợi, nhưng nó là sai về mặt kỹ thuật.