Nima uchun 6.35.toFixed(1) == 6.3?
Math.round va toFixed hujjatlari bo’yicha ikkala raqam ham eng yaqin raqamga qadar: 0..4 pastga, 5..9 esa yuqoriga ko’tariladi.
Masalan:
alert((1.35).toFixed(1)); // 1.4
Quyidagi o’xshash misolda nima uchun 6.35 6.4 ga emas, 6.3 ga yaxlitlangan?
alert((6.35).toFixed(1)); // 6.3
6.35 ni qanday qilib to’g’ri yo’l bilan yaxlitlash kerak?
Ichki o’nlik kasr 6.35 cheksiz ikkilikdir. Bunday holatlarda har doimgidek, u aniqlikni yo’qotish bilan saqlanadi.
Ko’raylikchi:
alert((6.35).toFixed(20)); // 6.34999999999999964473
Aniq yo’qotish raqamning ko’payishiga va kamayishiga olib kelishi mumkin. Bunday holda, raqam biroz kichikroq bo’lib qoladi, shuning uchun u yaxlitlanadi.
1.35 uchun nima?
alert((1.35).toFixed(20)); // 1.35000000000000008882
Bu erda aniq yo’qotish raqamni biroz kattaroq qildi, shuning uchun u yaxlitlandi.
6.35 bilan qanday qilib muammoni hal qilishimiz mumkin, agar u to’g’ri yo’lga aylantirilishini xohlasak?
Yaxlitlanishdan oldin uni butun songa yaqinlashtirishimiz kerak:
alert((6.35 * 10).toFixed(20)); // 63.50000000000000000000
E’tibor bering, 63.5 hech qanday aniq yo’qotishlarga ega emas. Buning sababi, 0,5 kasr qismi aslida 1/2 dir. 2 kuchlariga bo’linadigan qismlar ikkilik tizimda to’liq ifodalanadi, endi biz uni yaxlitlashimiz mumkin:
alert(Math.round(6.35 * 10) / 10); // 6.35 -> 63.5 -> 64(yaxlitlangan) -> 6.4