1. Hitung dengan js
12.32*7 Apa hasilnya? Jawaban: 86.24000000000001
Mengapa masalah ini terjadi? Bagaimana cara mengatasinya?
Ada bug di js saat menangani perkalian dan pembagian desimal. Solusinya bisa: ubah desimal menjadi bilangan bulat untuk diproses.
Perhitungan di atas dapat diubah menjadi:
12.32*100*7/100
Hasilnya: 86,24, benar.
Lakukan juga beberapa perhitungan:
8.80*100*12/100
Hasil: 105.60000000000002
Masalah serupa akan terjadi dengan 38.80.
Akurasi meningkat 10 kali lipat:
8.80*1000*12/1000
Hasil: 105.6
Itu normal.
16,40*1000000*6/1000000
Ada juga masalah dengan hasilnya
Agar eksekusi js lebih akurat, pada perhitungan desimal js selanjutnya, langsung perluas nilainya sebanyak 10.000 kali lalu bagi dengan 10.000 untuk menyelesaikan soal.
varnum = 38,80;
var angka2 = 13;
peringatan(angka * 10000 * 12/10000);
Bilangan yang akan dikalikan dan dibagi sudah diuji dan ternyata 10.000. Jika lebih kecil, beberapa bilangan akan menimbulkan masalah. Jika lebih besar (1.000.000), beberapa bilangan juga akan menimbulkan masalah.
dua,
Copy kode kodenya sebagai berikut:
<penundaan skrip>
Nomor.prototipe.rate=fungsi(){
varoStr=ini.toString();
jika(oStr.indexOf(".")==-1)
kembali1;
kalau tidak
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}
fungsitrans(){
args=tran.argumen;
vartemp=1;
untuk(i=0;i<args.panjang;i++)
suhu*=args[i]*args[i].rate();
untuk(i=0;i<args.panjang;i++)
temp/=args[i].rate();
suhu kembali
}
peringatan(trans(11,22.9));
</skrip>
Solusi ini sedikit lebih rumit, tetapi memberi Anda gambaran tentang proses sebenarnya dalam menyelesaikan masalah ini.
Copy kode kodenya sebagai berikut:
//Fungsi pembagian, digunakan untuk mendapatkan hasil pembagian yang akurat
//Catatan: Hasil pembagian JavaScript akan mengalami error, yang akan lebih terlihat jelas saat membagi dua bilangan floating point. Fungsi ini mengembalikan hasil pembagian yang lebih akurat.
//Panggilan: accDiv(arg1,arg2)
//Nilai yang dikembalikan: hasil pasti dari pembagian arg1 dengan arg2
fungsi 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].length}catch(e){}
dengan(Matematika){
r1=Nomor(arg1.toString().replace(".",""))
r2=Nomor(arg2.toString().replace(".",""))
kembali (r1/r2)*pow(10,t2-t1);
}
}
//Tambahkan metode div ke tipe Nomor agar lebih nyaman untuk dipanggil.
Nomor.prototipe.div = fungsi (arg){
kembalikan accDiv(ini, arg);
}
//Fungsi perkalian, digunakan untuk mendapatkan hasil perkalian yang akurat
//Catatan: Hasil perkalian JavaScript akan mengalami error, yang akan semakin terlihat saat dua bilangan floating point dikalikan. Fungsi ini mengembalikan hasil perkalian yang lebih akurat.
//Panggilan: accMul(arg1,arg2)
//Nilai kembalian: hasil pasti dari mengalikan arg1 dengan arg2
fungsi 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 Number(s1.replace(".",""))*Nomor(s2.replace(".",""))/Math.pow(10,m)
}
// Tambahkan metode mul ke tipe Nomor agar lebih nyaman untuk dipanggil.
Nomor.prototipe.mul = fungsi (arg){
kembalikan accMul(arg, ini);
}
//Fungsi penjumlahan, digunakan untuk mendapatkan hasil penjumlahan yang akurat
//Catatan: Hasil penjumlahan JavaScript akan mengalami error, yang akan lebih terlihat jelas saat menambahkan dua bilangan floating point. Fungsi ini mengembalikan hasil penjumlahan yang lebih akurat.
//Panggilan: accAdd(arg1,arg2)
// Nilai yang dikembalikan: hasil persis dari arg1 ditambah arg2
fungsi 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}
m=Matematika.pow(10,Matematika.max(r1,r2))
kembali (arg1*m+arg2*m)/m
}
//Tambahkan metode penambahan ke tipe Nomor agar lebih nyaman untuk dipanggil.
Nomor.prototipe.tambahkan = fungsi (arg){
return accAdd(arg,ini);
}