Derse geri dön

6.35.toFixed(1) == 6.3 ?

önem: 4

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