Không có lý do lịch sử nào. Kiểu lệch lạc này đã có từ năm chấm. Dân gian làm điều này khi họ cảm thấy rất, rất nghịch ngợm. Đó là sự lạm dụng của số học dấu phẩy động và nhiều lập trình viên chuyên nghiệp có kinh nghiệm đã mắc phải nó. Ngay cả Java bods cũng đã lên đến phiên bản 1.7. Các chàng trai vui tính.
Phỏng đoán của tôi là một hàm làm tròn tiếng Đức độc đáo không có sẵn chính thức cho đến khi C ++ 11 (mặc dù C nhận được của chúng trong C99), nhưng đó thực sự không có lý do gì để áp dụng cái gọi là thay thế.
Đây là vấn đề: floor(0.5 + input)
không phải lúc nào cũng khôi phục kết quả giống như std::round
cuộc gọi tương ứng !
Lý do khá tinh vi: điểm giới hạn cho một phép làm tròn của Đức, a.5
đối với một số nguyên a
, do một tính chất ngẫu nhiên của vũ trụ, là một hợp lý dyadic . Vì điều này có thể được biểu diễn chính xác trong dấu phẩy động IEEE754 lên đến lũy thừa thứ 52 của 2, và sau đó làm tròn dù sao cũng là không cần lựa chọn, std::round
luôn hoạt động bình thường. Đối với các lược đồ dấu phẩy động khác, hãy tham khảo tài liệu.
Nhưng việc thêm 0.5
vào a double
có thể gây ra sự thiếu chính xác gây ra một số giá trị thấp hơn hoặc quá mức. Nếu bạn nghĩ về nó, việc cộng hai double
giá trị với nhau - đó là sự khởi đầu của các chuyển đổi denary vô tình - và áp dụng một hàm là một hàm rất mạnh của đầu vào (chẳng hạn như hàm làm tròn), chắc chắn sẽ kết thúc trong nước mắt.
Đừng làm vậy .
Tham khảo: Tại sao Math.round (0.49999999999999994) trả về 1?