Hiển thị các bài đăng có nhãn C++. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C++. Hiển thị tất cả bài đăng

31/12/2012

Cắt số lẻ trong số double

Trong các phần mềm tài chính, ngân hàng thường có bài toán như sau:
Cho một số double, bạn hãy cắt bỏ các số lẻ sau số lẻ thứ k trong phần thập phân.
Đứng trước bài toán này bạn thường nghĩ đến giải pháp cắt chuỗi. Biến double sang NSString rồi cắt chuỗi.
Tuy nhiên khi bạn chuyển số double sang NSString bằng string format %.*f bạn sẽ gặp phải vấn đề làm tròn số lên. Bạn lại nghĩ ra vậy tôi lấy đến k+1 số lẻ rồi cắt bỏ chữ số cuối cùng.Tuy nhiên giải pháp này lại bị vấn đề làm tròn số lan truyền khi chữ số thứ k+1 là số 9. Để tránh làm tròn số lan truyền một bạn khác lại đề nghị chuyển double sang NSNumber trước khi chuyển sang NSString. Một điều không may cho giải pháp này khi bạn chuyển các số double như 1.05, 0.05 thì bạn sẽ nhận được các số 1.049999..., 0.049999,.. (xem bài viết Vấn đề làm tròn số khi dùng double). Ngoài ra bạn cũng có thể nghĩ đến các hàm C khác khi modf, ... F giới thiệu cách sử dụng hàm floor như sau:
floor(x*pow(10,k)+1E-10)/pow(10,k)