назад до уроку

Чому 6.35.toFixed(1) == 6.3?

важливість: 4

Згідно з документацією 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. Дроби, розділені на 2, точно представлені у двійковій системі, і ми можемо її округлити:

alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(округлене) -> 6.4