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). Я лично больше склоняюсь к тому, чтобы рекомендовать некоторую явную комбинацию Math.round/ceil/floor, опять же, как упоминали другие. Изменить: ... хотя, вернувшись javascript и прочитав ваше разъяснение javascript , ваш вариант использования ecmascript (округление до целого числа) определенно vanillajs вызывает функцию с подходящим vanilla-js названием Math.round.

javascript

cross-browser

2022-10-27T14:10:53+00:00
Вопросы с похожей тематикой, как у вопроса:

Math.round (num) vs num.toFixed (0) и несоответствия в браузере