Hỏi cách sửa lỗi số thập phân của Javascript
Chào các bạn.
Mình gặp 1 lỗi khi sử dụng Javascript để tính toán cho ra phần thập phân không chính xác.
Trường hợp 1:
Kết quả đúng: 77.8055 + 0.3 = 78.1055
Javascript: 77.8055 + 0.3 =78.10549999999999
Trường hợp 2:
Kết quả đúng: 77.8055*220070 = 17122656,385
Javascript: 77.8055*220070 = 17122656.384999998
jsfiddle demo
Trường hợp 2 mình xử lý bằng cách : (77.8055*10*220070*10)/100 thì thấy OK nhưng không biết nếu gặp số khác thì có Ok không nữa.
Còn trường hợp mình bó tay.
Nhờ các bạn có kinh nghiệm chia sẽ kinh nghiệm xử lý trường hợp này với.
Xin cám ơn!
Máy tính không biểu diễn chính xác số có phần thập phân được. Cái này là giới hạn chung rồi.
Bạn thường xử lý trường hợp này như thế nào vậy?
Cần lấy mấy số lẻ?
Bạn chỉ cần a = 78.8055 + 03
a = a.toFixed(4)
Là nó sẽ ra, chênh nhau chút xíu lẻ chắc không quan trọng lắm vì có lẽ bạn không đang tính toán trong một lĩnh vực khoa học cần độ chính xác rất cao.
Mình cám ơn.
Nhưng làm vậy không được bạn ạ.
Vì không phải lúc nào mình toFixed(4) thì kết quả nó cũng đúng.
Vd:
Kết quả đúng: a= 78.80535
Kết quả sai: b = 78.80534999999999
Nếu mình lấy b = b.toFixed(4) thì => b = 78.8053 (Sai)
Máy tính không biểu diễn chính xác số thập phân, kể cả nhân lên rồi chia vẫn gây sai sót. Để tránh sai sót, cần dẹp ngay việc sử dụng built-in real number của ngôn ngữ. Đối với JS thì dùng lib này:
MikeMcl/decimal.js
decimal.js - An arbitrary-precision Decimal type for JavaScript
Nếu thay vì fixed(4) thì bạn fix từ 13 xuống 12 rồi 11 rồi 10… sẽ đúng