Bạn muốn lưu trữ tiền tệ của bạn long
và tính toán tiền tệ của bạn double
, ít nhất là một bản sao lưu. Bạn muốn tất cả các giao dịch diễn ra như long
.
Lý do bạn muốn lưu trữ tiền tệ của mình long
là vì bạn không muốn mất bất kỳ loại tiền nào.
Giả sử bạn sử dụng một double
, và bạn không có tiền. Ai đó cho bạn ba xu, và sau đó đưa họ trở lại.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Chà, điều đó không tuyệt lắm. Có thể ai đó có 10 đô la muốn cho tài sản của họ đi bằng cách trước tiên đưa cho bạn ba xu, sau đó đưa 9,70 đô la cho người khác.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
Và sau đó bạn cung cấp cho họ các xu trở lại:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Đây chỉ là hỏng.
Bây giờ, chúng ta hãy sử dụng lâu dài và chúng ta sẽ theo dõi một phần mười xu (vì vậy 1 = 0,001 đô la). Chúng ta hãy cho mọi người trên hành tinh một tỷ, một trăm mười hai triệu, bảy mươi lăm nghìn, một trăm bốn mươi ba đô la:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Ừm, chờ đã, chúng tôi có thể cho mọi người hơn một tỷ đô la, và chỉ chi tiêu ít hơn hai? Tràn ngập là một thảm họa ở đây.
Vì vậy, bất cứ khi nào bạn tính toán một số tiền để chuyển, hãy sử dụng double
và Math.round
để nhận được long
. Sau đó sửa chữa số dư (cộng và trừ cả hai tài khoản) bằng cách sử dụng long
.
Nền kinh tế của bạn sẽ không bị rò rỉ, và nó sẽ mở rộng lên tới một triệu đô la.
Có nhiều vấn đề phức tạp hơn - ví dụ: bạn sẽ làm gì nếu bạn thực hiện hai mươi khoản thanh toán? * - nhưng điều này sẽ giúp bạn bắt đầu.
* Bạn tính toán một khoản thanh toán là gì, làm tròn đến long
; sau đó nhân lên 20.0
và kiểm tra xem nó nằm trong phạm vi; nếu vậy, bạn nhân số tiền thanh toán 20L
với số tiền được khấu trừ từ số dư của bạn. Nói chung, tất cả các giao dịch phải được xử lý như long
, vì vậy bạn thực sự cần phải tổng hợp tất cả các giao dịch riêng lẻ; bạn có thể nhân như một phím tắt, nhưng bạn cần đảm bảo rằng bạn không thêm các lỗi làm tròn và bạn không bị tràn, điều đó có nghĩa là bạn cần kiểm tra double
trước khi thực hiện phép tính thực long
.