Hitung desimal besar (lebih dari 15 digit) dalam Javascript

Seperti yang kita ketahui, Javascript memiliki beberapa masalah (atau fitur) dengan penghitungan angka desimal. Misalnya:

console.log(0.1 + 0.2) // 0.30000000000000004

Dan kita tahu bahwa kita dapat menghindarinya menggunakan perpustakaan yang berbeda (misalnya saya menggunakan bignumber.js ), dan sekarang kita mendapatkan apa yang diharapkan:

console.log(Number(new BigNumber(0.1).plus(0.2))); // 0.3
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

TAPI

Bignumber.js memiliki keterbatasan:

Ia menerima nilai tipe nomor (hanya hingga 15 digit signifikan), string, atau objek BigNumber.

Kita dapat meneruskan sebuah string (mungkin saja), tetapi dengan cara ini kita dapat kehilangan beberapa digit dari akhir:

console.log(Number(new BigNumber(0.1).plus("198.43092534959501"))); // 198.530925349595, not 198.53092534959501
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

Sekarang saya bekerja dengan cryptocurrency dan sering kali saya berurusan dengan angka seperti 198.43092534959501, dan dalam hal ini saya mendapatkan kesalahan (seperti yang diharapkan):

console.log(Number(new BigNumber(0.1).plus(198.43092534959501))); // error
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

Saya tahu bahwa beberapa orang menggunakan pengganda tambahan, tetapi ini tidak akan berfungsi dalam kasus yang disebutkan di atas. Jika Anda berurusan dengan mata uang kripto, Anda tahu, bahwa kami sebenarnya bekerja dengan nilai yang tidak dikalikan dan dikalikan (seperti 489964999999000000 dan 0.489964999999). Namun tujuan saya saat ini adalah menjumlahkan semua saldo fiat untuk mata uang yang berbeda, namun memiliki pengganda yang berbeda, jadi saya tidak bisa hanya menjumlahkan nilai yang tidak dikalikan, dan sepertinya saya perlu menjumlahkan nilai yang dikalikan.

Latar belakangnya kecil, namun pertanyaan umum saya adalah:

Cara menjumlahkan/mengalikan/dll. bilangan desimal yang lebih dari 15 digit?


person Commercial Suicide    schedule 03.04.2018    source sumber
comment
Saya pikir Anda menjawab pertanyaan Anda sendiri di latar belakang. Dikatakan BigNumber akan menerima nomor yang diformat sebagai string sebagai input.   -  person nbering    schedule 03.04.2018
comment
0.1 bukan angka desimal tetapi tipe data floating point. Dan tipe data floating point tersebut tidak cocok untuk perhitungan desimal karena memiliki tujuan yang berbeda. Dan itu tidak hanya berlaku untuk JS tetapi untuk bahasa lainnya.   -  person t.niese    schedule 03.04.2018


Jawaban (1)


Saya sudah menjawabnya di komentar, tapi ini demonstrasinya. BigNumber akan menerima nomor dalam format string untuk input.

console.log(new BigNumber(0.1).plus("198.43092534959501"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

person nbering    schedule 03.04.2018
comment
Ya, berhasil, terima kasih, tetapi dalam kasus ini 2 digit terakhir hilang. Apakah ada cara untuk menyimpan nomor lengkapnya? - person Commercial Suicide; 03.04.2018
comment
Jangan menyembunyikannya kembali ke Number dan Anda tetap menyimpan berapa pun jumlah digit yang telah dikonfigurasi BigDecimal untuk digunakan, bukan? - person Scott Sauyet; 03.04.2018
comment
Saya telah memperbarui jawabannya. Digit terakhir hilang karena sampel Anda mengembalikannya ke angka. Simpan saja angka-angkanya sebagai string atau BigNumber setiap saat. - person nbering; 03.04.2018
comment
Jawaban yang bagus, terima kasih (dan juga kepada @ScottSauyet)! Saya berharap kami bisa melakukannya dengan angka, tetapi jika tidak, tidak apa-apa, saya akan menyesuaikannya sendiri. Terima kasih lagi! - person Commercial Suicide; 03.04.2018
comment
Tidak ada cara untuk menjaga tingkat akurasi ini dalam JavaScript. Resolusi jumlah bit sudah termasuk dalam spesifikasi bahasa, sehingga perpustakaan diperlukan untuk menangani hal sebesar ini. Saya mengalami kesulitan yang sama saat bermain dengan format file kunci kripto di NodeJS. - person nbering; 03.04.2018
comment
Tidak masuk akal melakukannya dengan angka. Jika JS Numbers dapat menangani hal ini, maka perpustakaan BigNumber atau sejenisnya tidak diperlukan lagi. - person Scott Sauyet; 03.04.2018
comment
@ScottSauyet, terima kasih, saran bagus. Gagasan utamanya lebih jelas bagi saya sekarang. - person Commercial Suicide; 03.04.2018