tilbage til lektionen

Hvorfor er 6.35.toFixed(1) == 6.3?

vigtighed: 4

Ifølge dokumentationen afrunder både Math.round og toFixed til det nærmeste tal: 0..4 runder ned, mens 5..9 runder op.

For eksempel:

alert( 1.35.toFixed(1) ); // 1.4

I det lignende eksempel nedenfor, hvorfor afrundes 6.35 til 6.3 og ikke 6.4?

alert( 6.35.toFixed(1) ); // 6.3

Hvordan kan vi runde 6.35 korrekt?

Internt er decimalbrøken 6.35 en uendelig binær. Som altid i sådanne tilfælde gemmes den med et præcisionstab.

Lad os se:

alert( 6.35.toFixed(20) ); // 6.34999999999999964473

Præcisionstab kan forårsage både stigning og fald i et tal. I dette særlige tilfælde bliver tallet en smule mindre, derfor blev det afrundet nedad.

Og hvad med 1.35?

alert( 1.35.toFixed(20) ); // 1.35000000000000008882

Her gjorde præcisionstabet tallet en smule større, så det blev afrundet opad.

Hvordan kan vi løse problemet med 6.35, hvis vi vil have det afrundet korrekt?

Vi bør bringe det tættere på et helt tal før afrunding:

alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000

Bemærk at 63.5 slet ikke har noget præcisionstab. Det skyldes, at decimaldelen 0.5 faktisk er 1/2. Brøker divideret med potenser af 2 er nøjagtigt repræsenteret i det binære system, nu kan vi runde det korrekt:

alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(afrundet) -> 6.4