Осваиваем JS: округление до целого
Часто вычисления дают результаты, которые не соответствуют пределам нужных диапазонов. В результате нужно осуществлять JavaScript округление до определенного значения.
Для чего округлять числа?
JavaScript не хранит целые числа, поскольку их значения представлены в виде цифр с плавающей точкой. Многие дроби не могут быть представлены числом с определенным конечным количеством знаков после запятой, поэтому JavaScript может генерировать результаты, наподобие приведенного ниже:
На практике это не будет иметь никакого значения, поскольку речь идет о погрешности в 2 квинтилионные. Но это может отразиться на результате при работе с числами, которые представляют значения валют, процентов или размер файла. Поэтому нужно сделать JavaScript округление до целых или до определенного знака после запятой.
Округление десятичных чисел
Чтобы « обрезать » десятичное число, используются методы toFixed() или toPrecision() . Они оба принимают один аргумент, который определяет количество значимых и знаков после запятой, которые должны быть включены в результат:
- если для toFixed() аргумент не определен, значение по умолчанию равно 0 , то есть без знаков после запятой; максимальное значение аргумента равно 20 ;
- если для toPrecision() аргумент не задан, число не изменяется.
И toFixed() , и toPrecision возвращают округленное строчное представление результата, а не число. Это означает, что прибавление rounded к randNum в результате даст конкатенацию строк, а не одно число:
Если нужно получить в результате JavaScript округление до сотых, используйте parseFloat() :
toFixed() и toPrecision() также являются полезными методами для усечения большого количества знаков после запятой. Это удобно при работе с числами, представляющими денежные единицы:
Обратите внимание, что если в числе больше знаков, чем задано параметром точности, toPrecision будет выдавать результат в научном формате:
Как избежать ошибок при округлении десятичных дробей
В некоторых случаях toFixed и toPrecision осуществляют JavaScript округление в меньшую сторону , а не округление в большую сторону:
Результатом приведенного выше примера должно быть 1.01, а не 1. Если нужно избежать этой ошибки, я рекомендую использовать экспоненциальные числа:
Если нужно еще более надежное решение, чем округление, оно доступно на MDN .
Округление с помощью эпсилона
Альтернативный метод JavaScript, позволяющий осуществить округление до десятых, был введен в ES6 ( также известном, как JavaScript 2015 ). » Машинный эпсилон » обеспечивает разумный предел погрешности при сравнении двух чисел с плавающей запятой. Без округления, сравнения могут дать результаты, подобные следующим:
Math.EPSILON может быть использован в функции для получения корректного сравнения:
Функция принимает два аргумента : один содержит вычисления, второй ожидаемый ( округленный ) результат. Она возвращает сравнение этих двух параметров:
Все современные браузеры поддерживают математические функции ES6 . Но если необходимо обеспечить поддержку в старых браузерах, то нужно использовать полифиллы .
Усечение десятичных чисел
Все методы, представленные ранее, выполняют JavaScript округление до десятых . Чтобы усечь положительное число до двух знаков после запятой, умножить его на 100 , усечь снова, а затем полученный результат разделить на 100 , нужно:
Если требуется что-то более гибкое, можно воспользоваться побитовым оператором:
Округление до ближайшего числа
Чтобы осуществить округление до целого , используется Math.round JavaScript :
Обратите внимание, что » половинные значения «, такие как .5 , округляются вверх.
Округление в меньшую сторону до ближайшего целого числа
Если вы хотите округлять в меньшую сторону, используйте метод Math.floor() :
Округление » вниз » имеет одно направление для всех чисел, в том числе и для отрицательных. Это можно представить, как небоскреб с бесконечным количеством этажей, в том числе и ниже уровня фундамента ( представляющих отрицательные числа ). Если вы находитесь в лифте между подвальными этажами 2 и 3 ( что соответствует значению -2.5 ), Math.floor доставит вас на этаж -3 :
Если нужно избежать этого, используйте JavaScript Math округление с помощью Math.trunc() , поддерживаемый во всех современных браузерах ( кроме IE / Edge ):
MDN также предоставляет полифилл из трех строк для обеспечения поддержки Math.trunc в старых браузерах и IE / Edge .
Округление в большую сторону до ближайшего целого числа
Если вы хотите округлить десятичные числа вверх, используйте Math.ceil . Действие этого метода также можно представить, как бесконечный лифт: Math.ceil всегда везет вас » вверх «, независимо от того, является ли число отрицательным или положительным:
Округление до ближайшего кратного числа
Если нужно округлить значение до ближайшего числа, кратного 5 , создайте функцию, которая делит число на 5 , округляет его, а затем умножает результат на то же значение:
Если нужно выполнить JavaScript округление до двух знаков, можно передавать функции, как начальное число, так и кратность:
Чтобы использовать функцию, включите в ее вызов округляемое число и кратность:
Чтобы округлять значения только в большую или меньшую сторону замените в функции round на ceil или floor .
Привязка к диапазону
Иногда нужно получить значение х , которое должно находиться в пределах определенного диапазона. Например, нужно значение от 1 до 100 , но мы получаем значение 123 . Чтобы исправить это, можно использовать min() ( возвращает наименьшее из чисел ) и max ( возвращает максимально допустимое число ).
Можно создать функцию или расширение класса Number :
Округление по Гауссу
Округление по Гауссу (» банковское «, конвергентное или голландское ) представляет собой метод округления без статистической погрешности. Стандартное JavaScript округление иногда дает погрешности в большую сторону. Округление по Гауссу позволяет избежать этой погрешности с помощью округления до ближайшего четного числа. Лучшее решение, которое мне известно:
Десятичные числа в CSS
Так как JavaScript часто используется для получения информации о позиции или преобразования HTML-элементов , то можно задаться вопросом, что произойдет, если мы сгенерируем десятичные значения для элементов:
Современные браузеры поддерживают десятичные значения в блочной модели, в том числе процентные и пиксельные единицы.
Пожалуйста, оставьте ваши комментарии по текущей теме статьи. За комментарии, подписки, отклики, дизлайки, лайки огромное вам спасибо!
Округление чисел в JavaScript
В JavaScript есть несколько методов для округления чисел до нужного формата. Они отличаются принципом работы и имеют ряд особенностей, которые рассмотрим на примерах.
Math — встроенный в JS объект, который содержит свойства и методы с математическим уклоном.
Math.round
Math.round(x) — округляет число до ближайшего целого по математическому принципу. Если первая цифра после запятой равна или больше 5, то к положительному целому числу прибавляется единица.
К отрицательному идёт прибавка только если цифра строго больше 5:
Math.floor
Math.floor(x) — округление до наименьшего целого. Для положительных чисел всё что после запятой не учитывается и отбрасывается.
Для отрицательных логика та же, но целое число изменяется в меньшую сторону:
Math.ceil
Math.ceil(x) — это противоположность «Math.floor», то есть преобразование происходит в большую сторону.
Здесь без комментариев:
Math.trunc
Math.trunc(x) — предельно простая функция — для любых чисел отбрасывает всё после запятой.
Тоже самое для отрицательных:
Не поддерживается браузером «Internet Explorer».
Округление до нужного знака
Рассмотрим способы округления до определенного знака после запятой. Для этих целей может применяться любая предыдущая функция. Округлим «Pi» до 2 знаков после запятой.
Math.pow(10, 2) — возводит первый аргумент в степень (второй аргумент).
Number.toFixed
Этот метод из прототипа объекта «Number» похож на «Math.round», но с рядом отличий:
- результат приводится к типу «String»;
- если передаваемый аргумент больше количества знаков после запятой, то метод добавит к результату нули.
Для приведения результата к типу «Number» используйте функцию «parseFloat».
Как округлить число в большую сторону
Не забывайте, что вы используете целочисленное деление. Результат деления 1/30 — уже 0. Поэтому перейдите к делению дробных чисел (1.0/30.0 = 0.03333333. ), а уж это число округляйте вверх.
Можно без Math: (a + b — 1) / b
Вариант с целочисленным делением выглядит так: (a*b+b*b-1)/(b*b)
Найдём вариант с целочисленным делением.
Нетрудно проверить, что ceil(a/b) = — floor(-a/b) .
Т.е. если a/b — это округление вниз, то -(-a/b) это округление вверх.
Если при целочисленном делении дробная часть просто отбрасывается (что соответствует операции trunc), то в случае ab>0 округление вверх — это -(-a/b) ,
а в случае ab<0 — это a/b .