1. Gunakan JS untuk menghitung
12.32 * 7 Apa hasilnya?
Jawaban: 86.240000000000001
Mengapa masalah ini terjadi? Bagaimana cara menyelesaikannya?
Ada bug ketika JS berurusan dengan perkalian dan pembagian desimal. Solusinya bisa: Ubah desimal menjadi bilangan bulat untuk menanganinya.
Perhitungan di atas dapat diubah menjadi:
12.32 * 100 * 7/100
Hasilnya adalah: 86.24, benar.
Mari kita menghitungnya lagi:
8.80 * 100 * 12/100
Hasil: 105.600000000000002
Masalah serupa akan terjadi pada 38,80.
Tingkatkan akurasi 10 kali:
8.80 * 1000 * 12 /1000
Hasil: 105.6
Itu normal.
16.40 * 1000000 * 6 /1000000
Ada masalah dengan hasilnya
Untuk membuat eksekusi JS lebih akurat, nilainya dapat diperluas secara langsung 10.000 kali dalam perhitungan desimal JS berikutnya, dan kemudian dibagi 10.000 untuk menyelesaikan masalah.
var num = 38.80;
var num2 = 13;
peringatan (num * 10000 * 12/1000);
Jumlahnya dikalikan dan dibagi dengan 10.000 adalah yang paling cocok untuk pengujian. Beberapa angka memiliki masalah ketika mereka lebih kecil, dan beberapa angka memiliki masalah ketika mereka lebih besar (1000.000).
dua,
<script> number.prototype.rate = function () {varostr = this.toString (); if (ostr.indexof (".") ==-1) return1; elsereturnmath.pow (10, parseint (ostr.length-ostr.indexof (".")-1));} functiontran(){args=tran.arguments;vartemp=1;for(i=0;i<args.length;i++)temp*=args[i]*args[i].rate();for(i=0;i<args.length;i++)temp/=args[i].rate();returntemp} alert(tran(11,22.9)); </script>Solusi ini adalah solusi yang lebih rumit, tetapi dapat memberi Anda pemahaman kasar tentang proses sebenarnya menyelesaikan masalah ini.
// Pembagian fungsi digunakan untuk mendapatkan hasil divisi yang akurat // Catatan: Akan ada kesalahan dalam hasil divisi JavaScript, yang akan lebih jelas ketika membagi dua angka titik mengambang. Fungsi ini mengembalikan hasil divisi yang lebih akurat. // PANGGILAN: ACCDIV (arg1, arg2) // Nilai pengembalian: Hasil yang tepat dari arg1 dibagi dengan fungsi arg2 accdiv (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; coba {t1 = arg1.toString (). split (".") [1] .length} catch (e) {} coba {t2 = arg2.toString (). split (".") [1] .leng Th} catch (e) {} dengan (matematika) {r1 = angka (arg1.toString (). ganti (".", ")) r2 = number (arg2.toString (). ganti (". ",")) kembali (R1/R2)*POW (10, T2-T1);}} // Tambahkan metode Div ke jenis angka, membuatnya lebih nyaman untuk dihubungi. Number.prototype.div = function (arg) {return accDiv (this, arg);} // beberapa fungsi digunakan untuk mendapatkan hasil multiplikasi yang akurat // Catatan: Akan ada kesalahan dalam hasil multiplikasi JavaScript, yang akan lebih jelas ketika mengalikan dua bilangan titik mengambang. Fungsi ini mengembalikan hasil perkalian yang lebih akurat. // PANGGILAN: ACCMUL (ARG1, ARG2) // Nilai Pengembalian: Hasil yang tepat dari arg1 dikalikan dengan fungsi arg2 accmul (arg1, arg2) {var m = 0, s1 = arg1.toString (), s2 = arg2.toString (); coba {m+= s1.split (".") [1] .length} catch (e) {} coba {m+= s2.split (".") [1] .length} catch (e) {} return Nomor (S1.Replace (".", "))*Number (s2.replace (". ","))/Math.pow (10, m)} // Tambahkan metode MUL ke jenis nomor, yang lebih nyaman untuk dihubungi. Number.prototype.mul = function (arg) {return accmul (arg, this);} // fungsi penambahan digunakan untuk mendapatkan hasil penambahan yang akurat // Catatan: akan ada kesalahan dalam hasil penambahan JavaScript, yang akan lebih jelas ketika menambahkan dua angka floating-point. Fungsi ini mengembalikan hasil penambahan yang lebih akurat. // PANGGILAN: ACCADD (arg1, arg2) // Nilai pengembalian: Hasil pasti dari fungsi arg1 plus arg2 accadd (arg1, arg2) {var r1, r2, m; coba {r1 = arg1.toString (). split (".") [1] .length} catch (e) {r1 = 0} coba {r2 = arg2.toString (). split (".") [1] .length} catch (e) {r2 = 0} MATH (arg1*m+arg2*m)/m} // Tambahkan metode tambahkan ke jenis angka, membuatnya lebih nyaman untuk dihubungi. Number.prototype.add = function (arg) {return accadd (arg, this);}JavaScript di atas Hasil Penggandaan Desimal Penanganan kesalahan adalah semua konten yang telah saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.