Artikel ini pada asalnya diterbitkan di blog David Kaye
Saya mendapati kesilapan bulat dalam nombor (). Menghairankan, pembetulannya sangat mudah. Teruskan membaca ...
(1.015).toFixed(2) // 返回 "1.01" 而不是 "1.02"
lihat tweet saya mengenai soalan ini:
Chrome
Contoh 1
Cari corak
Hasil yang tidak dijangka berdasarkan input mesti berasal dari mod dikongsi dalam input. Oleh itu, bukannya mengkaji spesifikasi nombor ().(1.015).toFixed(2) // 返回 "1.01" 而不是 "1.02"
Contoh berikut melakukan operasi pada integer 1 hingga 128, menambah perpuluhan .015 untuk setiap integer, dan mengembalikan hasil "tidak dijangka". Setiap hasil mengandungi bidang yang diberikan, dijangkakan, dan sebenar. Di sini kita menggunakan array itu dan mencetak setiap item.
function test({fraction, maxValue}) { fraction = fraction.toString() var fixLength = fraction.split('.')[1].length - 1 var last = Number(fraction.charAt(fraction.length - 1)) var fixDigit = Number(fraction.charAt(fraction.length - 2)) last >= 5 && (fixDigit = fixDigit + 1) var expectedFraction = fraction.replace(/[\d]{2,2}$/, fixDigit) return Array(maxValue).fill(0) .map(function(ignoreValue, index) { return index + 1 }) .filter(function(integer) { var number = integer + Number(fraction) var actual = number.toFixed(fixLength) var expected = Number(number + '1').toFixed(fixLength) return expected != actual }) .map(function(integer) { var number = Number(integer) + Number(fraction) return { given: number.toString(), expected: (Number(integer.toFixed(0)) + Number(expectedFraction)).toString(), actual: number.toFixed(fixLength) } }) }
Untuk keadaan ini, terdapat 6 hasil yang tidak dijangka.
test({ fraction: .015, maxValue: 128 }) .forEach(function(item) { console.log(item) })
Saya dapati ralat ini mengandungi tiga bahagian:
Sebagai contoh, untuk integer 1 hingga 128, (nilai). TOFIXED (2) menggunakan 3 tempat perpuluhan yang berbeza yang berakhir pada 5, mengakibatkan hasil berikut:
Mereka yang mengetahui lebih lanjut mengenai matematik titik binari dan terapung daripada yang saya lakukan mungkin dapat menyimpulkan punca utama. Saya meninggalkan ini kepada pembaca sebagai latihan.
lebih daripada satu perpuluhan untuk menetapkan nilai sentiasa dibulatkan dengan betul; Kedua -dua ujian dan polyfill menggunakan pengetahuan ini untuk pemeriksaan ketepatan.
Ini bermakna bahawa semua pelaksanaan tofixed () mempunyai pembetulan mudah: jika nilai mengandungi perpuluhan, tambah "1" ke akhir versi rentetan nilai yang akan diubah suai. Ini mungkin tidak "mematuhi spesifikasi", tetapi ini bermakna kita akan mendapat hasil yang diharapkan tanpa perlu meninjau semula tahap operasi titik binari atau terapung yang lebih rendah.
<code>Object { given: "1.015", expected: "1.02", actual: "1.01" } Object { given: "4.015", expected: "4.02", actual: "4.01" } Object { given: "5.015", expected: "5.02", actual: "5.01" } Object { given: "6.015", expected: "6.02", actual: "6.01" } Object { given: "7.015", expected: "7.02", actual: "7.01" } Object { given: "128.015", expected: "128.02", actual: "128.01" }</code>
(1.005).toFixed(2) == "1.01" || (function(prototype) { var toFixed = prototype.toFixed prototype.toFixed = function(fractionDigits) { var split = this.toString().split('.') var number = +(!split[1] ? split[0] : split.join('.') + '1') return toFixed.call(number, fractionDigits) } }(Number.prototype));
test({ fraction: .0015, maxValue: 516 }) // Array [] test({ fraction: .0015, maxValue: 516 }).length // 0
Kaedah Number.TOfixed () dalam JavaScript digunakan untuk memformat nombor menggunakan notasi tetap. Ia mengembalikan perwakilan rentetan nombor yang tidak menggunakan perwakilan eksponen dan mempunyai bilangan digit yang ditentukan selepas titik perpuluhan. Sekiranya perlu, nombor itu dibulatkan dan rentetan hasil mempunyai titik perpuluhan selepas panjang.
Oleh kerana cara JavaScript mengendalikan nombor titik terapung binari, kaedah nombor.tofixed () kadang -kadang memberikan hasil yang tidak tepat. JavaScript menggunakan nombor titik terapung binari, yang tidak dapat mewakili semua perpuluhan perpuluhan dengan tepat. Ketidaktepatan ini boleh membawa kepada hasil yang tidak dijangka apabila bilangannya dibulatkan kepada nombor perpuluhan tertentu menggunakan kaedah Number.TOfixed ().
Satu cara untuk memperbaiki kesilapan pembulatan dalam number.tOfixed () kaedah adalah menggunakan fungsi pembulatan tersuai. Fungsi ini boleh mengambil kira ciri -ciri pemprosesan digital JavaScript dan memberikan hasil yang lebih tepat. Sebagai contoh, anda boleh menggunakan fungsi yang melipatgandakan nombor dengan kuasa 10, mengundurkannya ke integer terdekat, dan membahagikannya dengan kuasa yang sama 10.
tidak, kaedah number.tOfixed () hanya boleh digunakan dengan nilai angka. Jika anda cuba menggunakannya dengan nilai bukan angka, JavaScript akan membuang TypeError. Jika anda perlu menggunakan kaedah ini dengan nilai yang mungkin bukan nombor, anda harus terlebih dahulu menyemak sama ada nilai itu adalah nombor.
number.tOfixed () dan kaedah pembulatan lain biasanya boleh diabaikan. Walau bagaimanapun, jika anda melakukan banyak operasi, menggunakan fungsi pembulatan tersuai mungkin sedikit lebih cepat daripada menggunakan kaedah Number.TOfixed ().
tidak, kaedah number.tOfixed () hanya boleh bulat ke maksimum 20 tempat perpuluhan. Sekiranya anda cuba melangkah ke lebih daripada 20 tempat perpuluhan, JavaScript akan membuang RangeError.
number.tOfixed () kaedah mengendalikan nombor negatif dengan cara yang sama seperti berurusan dengan nombor positif. Ia melengkapkan nilai mutlak nombor ke bilangan tempat perpuluhan yang ditentukan dan menambah tanda negatif.
Ya, kaedah nombor.tOfixed () adalah bahagian standard JavaScript dan harus tersedia dalam semua persekitaran JavaScript. Walau bagaimanapun, kerana enjin JavaScript yang berbeza mengendalikan nombor secara berbeza, hasilnya mungkin tidak sama persis dalam semua persekitaran.
Jika anda tidak lulus sebarang argumen ke kaedah nombor. Ini bermakna ia akan mengelilingi nombor ke integer terdekat.
Ya, anda boleh menggunakan kaedah number.tOfixed () dengan bilangan besar. Walau bagaimanapun, ingat bahawa JavaScript hanya boleh mewakili nombor dengan tepat sehingga 2^53 - 1. Jika anda cuba menggunakan kaedah Number.TOfixed () dengan nombor yang lebih besar daripada nombor ini, ia mungkin tidak memberikan hasil yang tepat.
Atas ialah kandungan terperinci Nombor ().. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!