Для решения ваших двух оригинальных вопросов / вопросов:
Математическое окружение (num) против num.toFixed (0)
Проблема здесь заключается в неправильном представлении, что они всегда должны давать один и тот же результат. На самом деле они регулируются другими правилами. Посмотрите на отрицательные числа, например. Поскольку Math.round
использует "круглая половина вверх" как правило, вы увидите, что Math.round(-1.5)
оценивается в -1
, хотя Math.round(1.5)
оценивается в 2
.
Number.prototype.toFixed
, с другой стороны, использует то, что в основном эквивалентно "круглая половина от нуля" , как правило, согласно шагу 6 спецификации , которая по сути, говорит, что негативы следует рассматривать как положительные числа, а затем добавить отрицательный знак в конце. Таким образом, (-1.5).toFixed(0) === "-2"
и (1.5).toFixed(0) === "2"
являются истинными утверждениями во всех совместимых со спецификацией браузерах. Обратите внимание, что эти значения являются строками, а не числами. Далее обратите внимание, что -1.5.toFixed(0)
и -(1.5).toFixed(0)
имеют значение === -2
(число) из-за приоритета оператора.
Несоответствия браузера
Большинство современных браузеров - или, по крайней мере, те, которые вы, возможно, ожидаете поддерживать на момент написания этой статьи , за исключением IE - должны все реализовывать спецификации правильно. (Согласно комментарию Рене , проблема toFixed
, которую вы указали в Opera, была исправлена, по-видимому, с тех пор, как они начали использовать тот же движок JS, что и Chrome.) Это все еще стоит повторить, даже если спецификации были Реализованная последовательно во всех браузерах, поведение, определенное в спецификации, особенно для округления toFixed
, все еще может быть немного неинтуитивным для «простых смертных» разработчиков JS, которые ожидают истинной математической точности - см. Javascript toFixed Not Rounding и эта ошибка «работает как задумано» , которая была подана на движке V8 JS для примеров.
Заключение
Короче говоря, это две разные функции с двумя разными типами возврата и двумя разными наборами правил для округления.
Как уже предлагали другие, я также хотел бы сказать: «используйте любую функцию, которая подходит вашему конкретному случаю использования» (с особой тщательностью отмечая особенности toFixed
, особенно ошибочную реализацию IE). Лично я бы больше склонялся к тому, чтобы рекомендовать какую-то явную комбинацию Math.round/ceil/floor
, опять же, как уже упоминали другие. Редактировать: ... хотя, вернувшись назад и прочитав ваши разъяснения, ваши прецедент (округление до целого числа) определенно вызывает метко названную функцию Math.round
.