menganalisa
JavaScript hanya memiliki satu nomor tipe angka, dan semua angka dalam JavaScript diwakili dalam format standar IEEE-754. Masalah presisi dari bilangan titik mengambang tidak unik untuk JavaScript, karena beberapa desimal mewakili digit tak terbatas dalam biner:
Biner desimal
0,1 0,0001 1001 1001 1001 ...
0.2 0.0011 0011 0011 0011 ...
0,3 0,0100 1100 1100 1100 ...
0.4 0.0110 0110 0110 0110 ...
0,5 0,1
0.6 0.1001 1001 1001 1001 ...
Jadi misalnya, 1.1, programnya tidak dapat benar -benar mewakili '1.1', tetapi hanya dapat mencapai tingkat akurasi tertentu.
1.0999999999999999999
Masalah dalam JavaScript lebih rumit, berikut adalah beberapa data uji di Chrome:
Input dan output
1.0-0.9 == 0.1 Salah
1.0-0.8 == 0.2 Salah
1.0-0.7 == 0.3 false
1.0-0.6 == 0.4 Benar
1.0-0.5 == 0.5 Benar
1.0-0.4 == 0.6 Benar
1.0-0.3 == 0.7 Benar
1.0-0.2 == 0.8 Benar
1.0-0.1 == 0.9 Benar
menyelesaikan
Jadi bagaimana cara menghindari masalah non-bug jenis ini dengan 1.0-0.9! = 0.1? Berikut adalah solusi yang saat ini digunakan lebih sering.
Salinan kode adalah sebagai berikut:
(1.0-0.9) .tofixed (digit) // tofixed () Parameter akurasi harus antara 0 dan 20
parsefloat ((1.0-0.9) .tofixed (10)) === 0.1 // Hasilnya benar
parsefloat ((1.0-0.8) .tofixed (10)) === 0.2 // Hasilnya benar
parsefloat ((1.0-0.7) .tofixed (10)) === 0.3 // Hasilnya benar
parsefloat ((11.0-11.8) .tofixed (10)) === -0.8 // Hasilnya benar
Metode pemurnian
Salinan kode adalah sebagai berikut:
// Gunakan metode alat isequal untuk menentukan apakah nilainya sama atau tidak
fungsi isequal (number1, number2, digit) {
Digit = Digit == Tidak Ditentukan?
return number1.tofixed (digit) === number2.tofixed (digit);
}
isEqual (1.0-0.7, 0.3);
// Metode ekstensi asli, lebih suka gaya berorientasi objek
Number.prototype.isequal = function (angka, digit) {
Digit = Digit == Tidak Ditentukan?
kembalikan this.tofixed (digit) === number.tofixed (digit);
}
(1.0-0.7) .iSequal (0.3);