Kenapa 6.35.toFixed(1) == 6.3?
Berdasarkan dokumentasi Math.round
dan toFixed
keduanya membulatkan ke angka terdekat: 0..4
turun sementara 5..9
naik.
Contohnya:
alert( 1.35.toFixed(1) ); // 1.4
Dalam contoh serupa di bawah ini, mengapa 6.35
dibulatkan menjadi 6.3
, dan tidak 6.4
?
alert( 6.35.toFixed(1) ); // 6.3
Bagaimana untuk membulatkan 6.35
dengan benar?
Secara internal pecahan desimal 6.35
adalah sebuah biner tanpa akhir. Seperti biasa dalam kasus seperti ini, disimpan dengan kehilangan presisi.
Ayo lihat:
alert( 6.35.toFixed(20) ); // 6.34999999999999964473
Kehilangan presisi dapat menyebabkan peningkatan dan penurunan angka. Dalam kasus khusus ini jumlahnya menjadi sedikit lebih sedikit, itu sebabnya dibulatkan.
Dan apa untuk 1.35
?
alert( 1.35.toFixed(20) ); // 1.35000000000000008882
Di sini kehilangan presisi membuat jumlahnya sedikit lebih besar, jadi itu dibulatkan.
Bagaimana kita dapat memperbaiki masalah dengan 6.35
jika kita ingin itu dibulatkan dengan cara yang benar?
Kita harus membawanya lebih dekat ke integer sebelum pembulatan:
alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000
Perhatikan bahwa 63.5
tidak memiliki kehilangan presisi sama sekali. Itu karena bagian desimal 0,5
sebenarnya1 / 2
. Pecahan yang dibagi oleh kekuatan 2
persis diwakili dalam sistem biner, sekarang kita dapat membulatkannya:
alert( Math.round(6.35 * 10) / 10); // 6.35 -> 63.5 -> 64(rounded) -> 6.4