Рассмотрим следующее:
var x = 2.175;
console.log(x.toFixed(2)); // 2.17
Что? Нет, не удивительно. Это довольно очевидно, см.: Литерал чисел 2.175
фактически хранится в памяти (по правилам IEEE-754) как значение, которое чуть меньше, чем 2,175. И это легко доказать:
console.log(x.toFixed(20)); // 2.17499999999999982236
Как это работает в последних версиях Firefox, Chrome и Opera при 32-разрядной установке Windows. Но это не вопрос.
Реальный вопрос заключается в том, как Internet Explorer 6 (!) действительно справляется с этим right, как это делают люди:
var x = 2.175;
console.log(x.toFixed(2)); // 2.18
console.log(x.toFixed(20)); // 2.17500000000000000000
ОК, я переоценил: на самом деле все исследователи Интернета, на которых я тестировал это (IE8-11, и даже MS Edge!), ведут себя одинаково. Тем не менее, WAT?
ОБНОВЛЕНИЕ: Он становится странным:
x=1.0;while((x-=0.1) > 0) console.log(x.toFixed(20));
IE Chrome
0.90000000000000000000 0.90000000000000002220
0.80000000000000000000 0.80000000000000004441
0.70000000000000010000 0.70000000000000006661
0.60000000000000010000 0.60000000000000008882
0.50000000000000010000 0.50000000000000011102
0.40000000000000013000 0.40000000000000013323
0.30000000000000015000 0.30000000000000015543
0.20000000000000015000 0.20000000000000014988
0.10000000000000014000 0.10000000000000014433
0.00000000000000013878 0.00000000000000013878
Почему разница - во всех, кроме последнего? И почему нет разницы в последнем? Это очень похоже на x=0.1; while(x-=0.01)...
, между прочим: пока мы не приблизимся к нулю, toFixed
в IE, по-видимому, пытается разрезать некоторые углы.
Отказ от ответственности: я do знают, что математика с плавающей запятой является некорректной. Я не понимаю, какая разница между IE и остальной частью мира браузера.