Ditulis dengan kata -kata sebelumnya:
Hari ini saya membantu kolega saya memecahkan masalah, yaitu ada banyak tempat desimal yang muncul ketika mengalikan desimal. Saya telah mengalami masalah ini sebelumnya, jadi saya akan merangkumnya secara khusus;
Jenis Angka:
Jenis angka adalah tipe ecmascript yang paling umum digunakan dan paling menarik; Jenis ini menggunakan format IEEE754 untuk mewakili bilangan bulat dan nilai-nilai titik mengambang (nilai-nilai titik mengambang juga merupakan nilai presisi ganda dalam beberapa bahasa). Untuk mendukung berbagai tipe data, ECMA-262 mendefinisikan format permukaan numerik yang berbeda.
Desimal:
var intnum = 10; //Bilangan bulat
Octal:
var octalnum1 = 070; // Octal 56
var octalnum2 = 079; // Nilai oktal tidak valid diselesaikan sebagai 79
Literal oktal tidak valid dalam mode ketat;
Hexadecimal:
var hexnum1 = 0xa; // 10
Ingat: Saat melakukan operasi, semua nilai yang dinyatakan dalam oktal dan heksadesimal akhirnya dikonversi menjadi desimal;
Mengapa pengoperasian desimal memiliki kesalahan?
Kemajuan tertinggi dari nilai titik mengambang adalah desimal 17 digit, tetapi akurasinya jauh lebih sedikit daripada bilangan bulat saat melakukan operasi; Bilangan bulat akan dikonversi menjadi desimal saat melakukan operasi; Dan ketika menghitung operasi desimal di Java dan JavaScript, desimal desimal pertama -tama akan dikonversi ke biner yang sesuai, dan beberapa desimal tidak dapat sepenuhnya dikonversi menjadi biner, sehingga kesalahan pertama terjadi di sini. Setelah semua desimal diubah menjadi biner, maka operasi biner dilakukan untuk mendapatkan hasil biner. Kemudian ubah hasil biner menjadi desimal, dan kesalahan kedua biasanya terjadi di sini.
Jadi (0,1+0.2)! = 03
Larutan:
Kode Program
Fungsi pembagian 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 pasti dari arg1 dibagi 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 = angka (arg1.toString (e) {} dengan (matematika) {r1 = angka (arg1.toString (e) {} (matematika) {r1 = angka (arg1.toString (e) {} (matematika) {r1 = angka (arg1.toString (e) {} (matematika) {r1 = angka (arg1.toString (e) {} (matematika) {r1 = bilangan (arg1.toString (). " r2 = angka (arg2.toString (). ganti (".", ")) return (r1/r2)*pow (10, t2-t1);}}Menambahkan metode div ke jenis angka lebih nyaman untuk dihubungi.
Number.prototype.div = function (arg) {return accDiv (this, arg); }Fungsi multiplikasi untuk mendapatkan hasil perkalian yang akurat
Catatan: Akan ada kesalahan dalam hasil perkalian dari JavaScript, yang akan lebih jelas ketika mengalikan dua angka titik mengambang. Fungsi ini mengembalikan hasil perkalian yang lebih akurat.
Panggilan: accmul (arg1, arg2)
Nilai pengembalian: Hasil pasti dari arg1 dikalikan 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) {} nomor kembali (s1.replace ("."Menambahkan metode MUL ke jenis angka lebih nyaman untuk dihubungi.
Number.prototype.mul = function (arg) {return accmul (arg, this);}Fungsi penambahan untuk mendapatkan hasil penambahan yang akurat
Catatan: Akan ada kesalahan dalam hasil penambahan JavaScript, yang akan lebih jelas ketika menambahkan dua angka titik mengambang. Fungsi ini mengembalikan hasil penambahan yang lebih akurat.
Panggilan: Accadd (arg1, arg2)
Nilai Pengembalian: Hasil Pasti dari Arg1 Plus Arg2
fungsi acadd (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 = math.pow (10, math.max (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);}Sertakan fungsi -fungsi ini di tempat yang ingin Anda gunakan, lalu panggil untuk menghitung.
Misalnya, jika Anda ingin menghitung: 7*0.8, maka ubah menjadi (7) .mul (8)
Operasi lain serupa, dan hasil yang lebih akurat dapat diperoleh.
Solusi 2:
Metode yang lebih umum digunakan, metode tofixed () dan tofixed () dapat membulatkan angka menjadi angka dengan angka desimal yang ditentukan. Menambahkan metode ini setelah hasil perhitungan kami ok; tetapi akan memiliki sedikit dampak pada keakuratan. Jika persyaratan akurasi tidak tinggi, disarankan untuk menggunakannya;