IEEE 754 and browsers, toFixed or toPrecission

Все числа в JavaScript, как целые так и дробные, имеют тип Number и хранятся в 64-битном формате IEEE-754, также известном как «double precision»
Так должно быть, но есть нюансы, отличия в итогах, возьмем простой алгоритм for (n=0.5; n<10; n+=1) console.log(n+0.05, (n+0.05).toFixed(1));
Google Chrome Версия 51.0.2704.103 Internet Explorer 11 Версия 11.0.9600.18314 Ваш браузер
+=0.05toFixed(1)toFixed(20) +=0.05toFixed(1)toFixed(20) +=0.05toFixed(1)toFixed(20)
0.550.60.55000000000000004441 0.550.60.55000000000000000000
1.551.61.55000000000000004441 1.551.61.55000000000000000000
2.552.52.54999999999999982236 2.552.62.55000000000000000000
3.553.53.54999999999999982236 3.553.63.55000000000000000000
4.554.54.54999999999999982236 4.554.64.55000000000000000000
5.555.55.54999999999999982236 5.555.65.55000000000000000000
6.556.56.54999999999999982236 6.556.66.55000000000000000000
7.557.57.54999999999999982236 7.557.67.55000000000000000000
8.558.68.55000000000000071054 8.558.68.55000000000000000000
9.559.69.55000000000000071054 9.559.69.55000000000000000000
Тут, конечно, под большим вопросом где подкрасить красным, Google Chrome выводит честные данные, а ИЕ то что нам нужно :-) Хотя и в ИЕ и в Хроме (тут и ИЕ соблюдает стандарты)
x = 0.1 + 0.2
0.30000000000000004
Кстати, в PHP результат будет 0.3, но это не заслуга, просто у него точность по умолчанию 14 знаков. Дабы уровнять и скорректировать результаты, можем использовать такую замену toFixed, позаимствовал у Angular
function toFixed(number, fractionSize) {
    return +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *