6.35.toFixed(1) == 6.3 ?
Dökümantasyona göre Math.round ve toFixed en yakın sayıya yuvarlarlar: 0..4 arası aşağı yuvarlarken 5..9 arası yukarı yuvarlar.
Örneğin:
alert( 1.35.toFixed(1) ); // 1.4
Peki aşağıdaki örnekte neden 6.4 e yuvarlamadı da 6.3 e yuvarladı?
alert( 6.35.toFixed(1) ); // 6.3
6.35 in doğru bir şekilde yuvarlanması için ne yapılmalıdır?
Aslında 6.35’in decimal bölümü sonsuz binarydir. Böyle bir durumda kesinlik kaybına uğrarlar.
alert( 6.35.toFixed(20) ); // 6.34999999999999964473
Bu kesinlik kaybı sayının küçülmesine veya büyümesine neden olabilir. Bu örnekte sayı çok çok küçük bir oranda küçülüyor bundan dolayı aşağıya yuvarladı.
1.35 için ise:
alert( 1.35.toFixed(20) ); // 1.35000000000000008882
Sayı çok küçük bir değer ile büyük limitin üstüne çıktı, bundan dolayı yukarıya yuvarladı.
Peki 6.35 için bu problem nasıl çözülebilir
Tam sayı değerini yuvarlama değerine yaklaştırılırsa problem çözülür:
alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000
63.5 hiçbir kayba uğramıyor dikkat ederseniz. Çünkü 0.5 lik fark aslında 1/2. 2 ve üstü ile yapılan işlemler binary sistemde tam olarak ifade edildiğinden dolayı bu problem çözülmektedir.
alert( Math.round(6.35 * 10) / 10); // 6.35 -> 63.5 -> 64(yuvarlandı) -> 6.4