چرا 6.35.toFixed(1) == 6.3?
بنابر مستندات Math.round
و toFixed
، هردو به نزدیکترین عدد آن را رند میکنند: 0..4
به پایین رند میشود و 5..9
به بالا.
به عنوان مثال:
alert( 1.35.toFixed(1) ); // 1.4
در مثال مشابه زیر، چرا 6.35
به 6.3
رند میشود، نه 6.4
؟
alert( 6.35.toFixed(1) ); // 6.3
چطور 6.35
را رند کنیم؟
در درون سیستم، یک عدد دودویی 6.35
بیپایان است. مثل همیشه، در این حالات با یک دقت از دست رفتهای ذخیره خواهد شد.
alert( 6.35.toFixed(20) ); // 6.34999999999999964473
این از دست دادن دقت میتواند در هم مقدار عدد را افزایش یا کاهش دهد. در این حالت خاص، عدد اندکی کوچک میشود، به همین علت به پایین رند میشود.
و اما 1.35
چی؟
alert( 1.35.toFixed(20) ); // 1.35000000000000008882
اینجا از دست دادن دقت باعث شد عدد اندکی بزرگتر شود، پس به بالا رند میشود.
چطور میتوانیم مشکل 6.35
را حل کنیم اگر بخواهیم که درست رند شود؟
باید به عدد صحیح نزدیک قبلیش رندش کنیم:
alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000
توجه داشته باشید که 63.5
هیچ از دست دادن دقتی ندارد. به خاطر قسمت اعشاری آن 0.5
که در اصل 1/2
است. کسرهای تقسیم شده بر دو به درستی در سیستم دودویی نمایش داده میشوند، حالا میتوانیم آن را رند کنیم:
alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(rounded) -> 6.4