Math.round (num) vs num.toFixed (0) и несоответствия в браузере
Для решения двух ваших исходных проблем .js / вопросов:
Math.round (num) vs num.toFixed (0)
Проблема заключается javascript в неправильном представлении vanilla-js о том, что они всегда должны .js давать одинаковый результат. На js самом деле они регулируются ecmascript разными правилами. Взгляните, например, на vanilla-javascript отрицательные числа. Поскольку javascript-dom Math.round
использует в качестве правила vanillajs "round half up", вы увидите, что Math.round(-1.5)
оценивается .js как -1
, хотя Math.round(1.5)
оценивается как js 2
.
Number.prototype.toFixed
, с другой стороны, использует .js то, что в основном эквивалентно js "round half away from zero", как правило, согласно step 6 of the spec, которое vanillajs по существу говорит о том, что browser-compatibility отрицательные числа должны vanilla-js рассматриваться как положительные javascript-execution числа, а затем снова добавлять javascript-library отрицательный знак в конец. Таким javascript-library образом, (-1.5).toFixed(0) === "-2"
и (1.5).toFixed(0) === "2"
являются истинными browser-compatibility операторами во всех браузерах, соответствующих javascript-dom спецификации. Обратите внимание, что javascript-dom эти значения представляют javascript-dom собой строки, а не числа. Обратите ecmascript внимание, что и -1.5.toFixed(0)
, и -(1.5).toFixed(0)
имеют cross-browser значение === -2
(число) из-за приоритета javascript-library оператора.
Несоответствия в браузере
Большинство современных js браузеров - или, по крайней мере, те, которые, как ожидается, будут поддерживать на момент написания этой статьи except for IE - должны правильно ecmascript реализовывать спецификации. (Согласно cross-browser Renee's comment, проблема toFixed
, на которую вы vanilla-javascript указали в Opera, была исправлена, предположительно vanilla-javascript с тех пор, как они начали vanilla-js использовать тот же движок .js JS, что и Chrome.) Все же browser-compatibility стоит повторить это, даже cross-browser если спецификации были реализованы javascript-dom последовательно во всех браузерах. , поведение, определенное javascript-dom в спецификации, особенно js для округления toFixed
, все еще browser-compatibility может быть немного неинтуитивным vanilla-javascript для "простых смертных" JS-разработчиков, которые javascript-dom ожидают истинной математической ecmascript точности - см. Javascript toFixed Not Rounding и this "works as intended" bug, которые javascript-dom были сохранены на движке browser-compatibility V8 JS. для примеров.
Заключение
Короче vanilla-javascript говоря, это две разные функции cross-browser с двумя разными типами возврата cross-browser и двумя разными наборами javascript-library правил округления.
Как предлагали browser-compatibility другие, я также хотел бы vanilla-javascript сказать «используйте ту функцию, которая javascript-dom соответствует вашему конкретному js варианту использования» (обращая ecmascript особое внимание на особенности vanilla-javascript toFixed
, особенно ошибочную реализацию javascript-execution IE). Я лично больше склоняюсь к тому, чтобы рекомендовать некоторую явную комбинацию Изменить: ... хотя, вернувшись javascript и прочитав ваше разъяснение javascript , ваш вариант использования ecmascript (округление до целого числа) определенно vanillajs вызывает функцию с подходящим vanilla-js названием Math.round/ceil/floor
, опять же, как упоминали другие. Math.round
.
javascript
cross-browser
Math.round (num) vs num.toFixed (0) и несоответствия в браузере
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.