Все числа в 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.05 | toFixed(1) | toFixed(20) |
+=0.05 | toFixed(1) | toFixed(20) |
+=0.05 | toFixed(1) | toFixed(20) |
0.55 | 0.6 | 0.55000000000000004441 |
0.55 | 0.6 | 0.55000000000000000000 |
| | |
1.55 | 1.6 | 1.55000000000000004441 |
1.55 | 1.6 | 1.55000000000000000000 |
| | |
2.55 | 2.5 | 2.54999999999999982236 |
2.55 | 2.6 | 2.55000000000000000000 |
| | |
3.55 | 3.5 | 3.54999999999999982236 |
3.55 | 3.6 | 3.55000000000000000000 |
| | |
4.55 | 4.5 | 4.54999999999999982236 |
4.55 | 4.6 | 4.55000000000000000000 |
| | |
5.55 | 5.5 | 5.54999999999999982236 |
5.55 | 5.6 | 5.55000000000000000000 |
| | |
6.55 | 6.5 | 6.54999999999999982236 |
6.55 | 6.6 | 6.55000000000000000000 |
| | |
7.55 | 7.5 | 7.54999999999999982236 |
7.55 | 7.6 | 7.55000000000000000000 |
| | |
8.55 | 8.6 | 8.55000000000000071054 |
8.55 | 8.6 | 8.55000000000000000000 |
| | |
9.55 | 9.6 | 9.55000000000000071054 |
9.55 | 9.6 | 9.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);
}