Anda ingin menyimpan mata uang Anda long
dan menghitung mata uang Anda double
, setidaknya sebagai cadangan. Anda ingin semua transaksi terjadi sebagai long
.
Alasan Anda ingin menyimpan mata uang Anda long
adalah karena Anda tidak ingin kehilangan mata uang apa pun.
Misalkan Anda menggunakan double
, dan Anda tidak punya uang. Seseorang memberi Anda tiga sen, lalu membawanya kembali.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Yah, itu tidak terlalu keren. Mungkin seseorang dengan $ 10 ingin memberikan kekayaannya dengan terlebih dahulu memberi Anda tiga sen, dan kemudian memberikan $ 9,70 kepada orang lain.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
Dan kemudian Anda memberi mereka uang receh kembali:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Ini baru saja rusak.
Sekarang, mari kita gunakan yang panjang, dan kami akan melacak sepersepuluh sen (jadi 1 = $ 0,001). Mari kita beri setiap orang di planet ini satu miliar, seratus dua belas juta, tujuh puluh lima ribu, seratus empat puluh tiga dolar:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Um, tunggu, kita bisa memberi semua orang lebih dari satu miliar dolar, dan hanya menghabiskan sedikit lebih dari dua? Overflow adalah bencana di sini.
Jadi, setiap kali Anda menghitung jumlah uang yang akan ditransfer, gunakan double
dan Math.round
itu untuk mendapatkan long
. Kemudian perbaiki saldo (tambahkan dan kurangi kedua akun) menggunakan long
.
Ekonomi Anda tidak akan bocor, dan akan meningkat hingga empat triliun dolar.
Ada masalah yang lebih rumit - misalnya, apa yang Anda lakukan jika Anda melakukan dua puluh pembayaran? * - tetapi ini harus Anda mulai.
* Anda menghitung apa satu pembayaran, bulat ke long
; kemudian kalikan dengan 20.0
dan periksa apakah itu dalam jangkauan; jika demikian, Anda melipatgandakan pembayaran dengan 20L
untuk mendapatkan jumlah yang dikurangkan dari saldo Anda. Secara umum, semua transaksi harus ditangani long
, jadi Anda benar-benar perlu meringkas semua transaksi individu; Anda dapat mengalikannya sebagai pintasan, tetapi Anda harus memastikan bahwa Anda tidak menambahkan kesalahan pembulatan dan bahwa Anda tidak meluap, yang berarti Anda perlu memeriksa double
sebelum melakukan perhitungan nyata dengan long
.