Math.floor(), Math.round(), Math.ceil() и Math.trunc() — JavaScript — Дока
- Кратко
- Как пишется
- На практике
- Николай Лопин советует
Кратко
Скопировано
Объект Math
содержит набор методов, который используется для округления чисел:
round
— округление по обычным правилам;( ) floor
— округление вниз;( ) ceil
— округление вверх;( ) trunc
— отбрасывание дробной части, не обращая внимания на знак аргумента.( )
Как пишется
Скопировано
Для обычного округления используйте Math
:
console. log(Math.round(15.52))// 16console.log(Math.round(15.3))// 15
console.log(Math.round(15.52))
// 16
console.log(Math.round(15.3))
// 15
Округление до ближайшего целого в большую сторону — Math
:
console.log(Math.ceil(15.52))// 16console.log(Math.ceil(15.3))// 16
console.log(Math.ceil(15.52))
// 16
console.log(Math.ceil(15.3))
// 16
Округление до ближайшего целого в меньшую сторону — Math
:
console.log(Math.floor(15.52))// 15console.log(Math.floor(15.3))// 15console.log(Math.floor(15.52)) // 15 console.log(Math.floor(15.3)) // 15
🛠 Используйте осторожно при работе с отрицательными числами:
console.log(Math.floor(-15.3))// -16
console.log(Math.floor(-15.3))
// -16
Так происходит потому что -16 меньше, чем -15, а округление происходит в меньшую сторону.
Отбрасывание дробной части — Math
console.log(Math.trunc(15.52))// 15console.log(Math.trunc(-15.3))// -15console.log(Math.trunc(0.123))// 0console.log(Math.trunc(-0.123))// -0Открыть демо в новой вкладкеconsole.log(Math.trunc(15.52)) // 15 console.log(Math.trunc(-15.3)) // -15 console.log(Math.trunc(0.123)) // 0 console.log(Math.trunc(-0.123)) // -0
На практике
Скопировано
Николай Лопин советует
Скопировано
🛠 Разные виды округления нужны в разных ситуациях:
- когда нужно разбить данные на страницы и посчитать общее количество страниц, используйте округление вверх:
const total
.Pages = Math . ceil ( total Items / items Per Page ) - когда нужно выбрать случайный элемент массива, используйте округление вниз:
Math
.. floor ( Math . random ( ) * array . length )
Если вы нашли ошибку, отправьте нам пул-реквест!
Во время отправки формы что-то пошло не так. Попробуйте ещё раз?
←
Объект Math
ctrl + alt + ←
→
Math
ctrl + alt + →
Как округлить до целого? — efim360.ru
В JavaScript всё является объектами. Любой объект в JavaScript по цепочке прототипов приходит к «Глобальному Объекту» языка. У «Глобального Объекта» JavaScript есть свои собственные свойства-конструкторы. Одним из таких свойств является объект Math
Чтобы округлять дробные числа до целых нужно использовать конструктор Math и его собственные методы округления чисел:
- ceil( ) — округление до наибольшего целого
- floor( ) — округление до наименьшего целого
- round( ) — округление до ближайшего целого
- trunc() — округление до целого в сторону нуля
Напоминаю, что по правилам классической математики 0,5 округляется в большую сторону. Так работает метод round( ).
JavaScript — Как округлить до целого — ceil, floor, round, trunc — 2022 год
Примеры
В качестве примеров мы будем передавать в методы дробные числа.
Округление до наибольшего целого
Math.ceil(1.11) 2 Math.ceil(1.5) 2 Math.ceil(1.7) 2Округлили дробное до наибольшего целого — JavaScript
Округление до наименьшего целого
Math.Округлили дробное до наименьшего целого — JavaScriptfloor(1.11) 1 Math.floor(1.5) 1 Math.floor(1.7) 1
Округление до ближайшего целого (как в математике)
Math.round(1.11) 1 Math.round(1.5) 2 Math.round(1.7) 2Округлили дробное до ближайшего целого — JavaScript
Округление до целого в сторону нуля
Math.trunc(-11.1) -11 Math.trunc(-11.6) -11 Math.trunc(12.1) 12 Math.trunc(12.6) 12Округление до целого в сторону нуля
Зачем нужно округлять дробные до целых?
Представьте, что где-то в логике алгоритма нужно найти середину массива? Если длина массива будет чётным числом, то при делении чётного числа на 2 мы всегда получим целое. А вот если длина массива будет нечётным числом, тогда деление на 2 вернёт нам дробное число.
Мы знаем, что в «правильных» массивах не бывает дробных индексов, а значит нам нужно будет явно указать какое-то целое, наиболее подходящее к серединному значению массива. Теперь вы знаете как можно округлить дробное до целого.
Где ещё можно применить округление до целого?
Почитайте решение одной из стандартных задач в языке JavaScript — Как проверить число на дробное?
Информационные ссылки
Стандарт ECMAScript — Раздел «21.3.2.10 Math.ceil ( x )» — https://tc39.es/ecma262/#sec-math.ceil
Стандарт ECMAScript — Раздел «21.3.2.16 Math.floor ( x )» — https://tc39.es/ecma262/#sec-math.floor
Стандарт ECMAScript — Раздел «21.3.2.28 Math.round ( x )» — https://tc39.es/ecma262/#sec-math.round
Руководство по округлению чисел в JavaScript
Math.round()
Метод Math.round() — самый простой способ округления чисел в JavaScript. Он округляет число до ближайшего целого числа, а это означает, что если число находится ровно посередине между двумя целыми числами, оно будет округлено в большую сторону. Этот метод прост и понятен, но может быть немного неточным при работе с большими числами. Например, если вы округлите число 1,5 до ближайшего целого числа, оно вернет 2, но если вы округлите число 1,6 до ближайшего целого числа, оно вернет 1. Это может привести к неожиданным результатам, если вы не будете осторожны.
Math.ceil()
Метод Math.ceil() аналогичен методу Math.round(), но всегда округляет число до ближайшего целого числа. Это означает, что если число находится ровно посередине между двумя целыми числами, оно всегда будет округляться в большую сторону. Этот метод полезен, если вы хотите, чтобы число всегда округлялось в большую сторону, но он может быть неточным, если вы имеете дело с большими числами. Например, если вы округлите число 1,5 до ближайшего целого числа, оно вернет 2, но если вы округлите число 1,6 до ближайшего целого числа, оно также вернет 2,9.0005
Math.floor()
Метод Math.floor() противоположен методу Math.ceil(). Он всегда округляет число до ближайшего целого числа. Это означает, что если число находится ровно посередине между двумя целыми числами, оно всегда будет округляться в меньшую сторону. Этот метод полезен, если вы хотите, чтобы число всегда округлялось в меньшую сторону, но он может быть неточным, если вы имеете дело с большими числами. Например, если вы округлите число 1,5 до ближайшего целого числа, оно вернет 1, но если вы округлите число 1,6 до ближайшего целого числа, оно также вернет 1,9.0005
Number.toFixed()
Метод Number.toFixed() немного сложнее других методов, но он может быть очень полезен при работе с большими числами. Этот метод позволяет вам указать количество знаков после запятой, до которого вы хотите округлить. Например, если вы хотите округлить число 1,5 до двух знаков после запятой, вы можете использовать для этого метод Number.toFixed(). Этот метод полезен, если вы хотите, чтобы число всегда округлялось до определенного числа знаков после запятой, но он может быть неточным, если вы имеете дело с большими числами.
Округление до ближайшего кратного
Иногда может потребоваться округлить число до ближайшего кратного другого числа. Например, если вы хотите округлить число до ближайшего кратного 10, вы можете использовать следующую формулу: Math.round(число / 10) * 10. Эта формула округлит число до ближайшего кратного 10. Этот метод полезно, если вы хотите, чтобы число всегда округлялось до ближайшего кратного другого числа, но может быть неточным, если вы имеете дело с большими числами.
Округление до ближайшей степени 10
Иногда вам может понадобиться округлить число до ближайшей степени 10. Например, если вы хотите округлить число до ближайшей степени 10, вы можете использовать следующую формулу: Math.pow(10, Math.round(Math.log10(число))). Эта формула округляет число до ближайшей степени 10. Этот метод полезен, если вы хотите, чтобы число всегда округлялось до ближайшей степени 10, но он может быть неточным, если вы имеете дело с большими числами.
Округление до ближайшего значащего числа
Иногда может потребоваться округлить число до ближайшего значащего числа. Например, если вы хотите округлить число до ближайшего значащего числа, вы можете использовать следующую формулу: Math.round(number * Math.pow(10, -Math.floor(Math.log10(number)))). Эта формула округляет число до ближайшего значащего числа. Этот метод полезен, если вы хотите, чтобы число всегда округлялось до ближайшего значащего числа, но он может быть неточным, если вы имеете дело с большими числами.
Округление до ближайшего целого числа, кратного другому числу
Иногда вам может понадобиться округлить число до ближайшего целого числа, кратного другому числу. Например, если вы хотите округлить число до ближайшего целого числа, кратного 10, вы можете использовать следующую формулу: Math.round(number / 10) * 10. Эта формула округлит число до ближайшего целого числа, кратного 10. Этот метод полезен, если вы хотите, чтобы число всегда округлялось до ближайшего целого числа, кратного другому числу, но он может быть неточным, если вы имеете дело с большими числами.
Округление до ближайшей целой степени другого числа
Иногда вам может понадобиться округлить число до ближайшей целой степени другого числа. Например, если вы хотите округлить число до ближайшей целой степени 10, вы можете использовать следующую формулу: Math.pow(10, Math.round(Math.log10(число))). Эта формула округляет число до ближайшей целой степени 10. Этот метод полезен, если вы хотите, чтобы число всегда округлялось до ближайшей целой степени другого числа, но он может быть неточным, если вы имеете дело с большими числа.
Округление до ближайшего целого числа другого числа
Иногда может потребоваться округлить число до ближайшего целого числа другого числа. Например, если вы хотите округлить число до ближайшего целого числа значащей цифры 10, вы можете использовать следующую формулу: Math.round(number * Math.pow(10, -Math.floor(Math.log10(number))). )). Эта формула округляет число до ближайшего целочисленного значащего разряда 10. Этот метод полезен, если вы хотите, чтобы число всегда округлялось до ближайшего целочисленного значащего разряда другого числа, но он может быть неточным, если вы имеете дело с большими числами.
Заключение
Округление чисел в JavaScript может быть непростой задачей, но немного потренировавшись, вы сможете быстро стать экспертом. В этом руководстве представлен обзор различных методов округления чисел в JavaScript, а также несколько советов и приемов, позволяющих извлечь из них максимальную пользу. Обладая необходимыми знаниями и практикой, вы можете легко стать экспертом по округлению чисел в JavaScript.
Пожалуйста, внимательно прочитайте этот отказ от ответственности перед тем, как начать пользоваться услугой. Используя эту услугу, вы подтверждаете, что вы полностью согласны и принимаете содержание этого заявления об отказе от ответственности. Вы можете отказаться от использования сервиса, если не согласны с данным отказом от ответственности. Этот документ создается автоматически на основе общедоступного контента в Интернете, захваченного Платформой машинного обучения для ИИ. Авторские права на информацию в этом документе, такую как веб-страницы, изображения и данные, принадлежат их соответствующим авторам и издателям. Такой автоматически сгенерированный контент не отражает точку зрения или мнение Alibaba Cloud. Вы несете ответственность за определение законности, точности, подлинности, практичности и полноты содержания. Мы рекомендуем вам проконсультироваться со специалистом, если у вас есть какие-либо сомнения по этому поводу. Alibaba Cloud не несет ответственности за любые последствия использования вами контента без проверки. Если у вас есть отзывы или вы обнаружите, что в этом документе используется некоторый контент, в отношении которого у вас есть права и интересы, свяжитесь с нами по этой ссылке: https://www.alibabacloud.com/campaign/contact-us-feedback. Мы будем решать вопрос в соответствии с соответствующими правилами.
Глубокое погружение в JavaScript — числа с плавающей запятой и известные ошибки округления
Фото Федерико Респини на Unsplash
Введение
> const num = 0,1 + 0,2 > console.log(num) // 0.30000000000000004
Вы когда-нибудь пытались запустить приведенный выше фрагмент кода? Является ли ответ тем, что вы ожидали? Если нет, то этот пост может показаться вам интересным.
Во-первых, мы подробно рассмотрим, как очень большие и очень маленькие числа могут быть представлены в памяти компьютера, а также какой международный стандарт используется. Затем мы воспользуемся этим знанием и привяжем его к JavaScript, а также к тому, как наше новое знание может изменить то, как мы рассматриваем определенные конструкции JavaScript.
Проблема
Сайт с плавающей запятой-gui.de
объясняет, почему числа с плавающей запятой действительно нужны в компьютерах. Это говорит
что, поскольку память компьютера ограничена, компьютеры не могут хранить числа с
бесконечная точность. Но какая точность нужна? И где это
нужный? Сколько целых цифр (до запятой) и сколько
цифры дроби
Рассмотрим три варианта использования:
- Инженер-строитель строит шоссе и измеряет длину дороги. К инженер, не важно ширина дороги 10 метров, или 10.0001 метр широкий, так как измерения, вероятно, не так точны в первом место.
- Инженер-электрик проектирует микросхему, где 0,0001 метра (или 0,1 миллиметры) огромная разница. Но тогда инженер-электрик никогда не должны иметь дело с расстояниями более 0,1 метра.
- Физик должен использовать скорость света (299 792 458 м/с) и Ньютона. гравитационная постоянная (около 0,00000000000667) вместе в одном расчет.
Инженер-строитель, инженер-электрик и физик каждый разные потребности, когда дело доходит до точности чисел, которые им нужно хранить. Но как эффективно хранить все эти числа в памяти компьютера? Имея фиксированное число целых чисел (до запятой) и дробных цифр (после запятой) совсем неэффективно из-за порядков величина разницы в числах, которые требуются для каждого из примеры использования, перечисленные выше.
Одним из решений этой проблемы, и, безусловно, наиболее распространенным, является число с плавающей запятой .
Краткая история
Арифметика с плавающей запятой и, следовательно, проблема 0.
,
не проблема JavaScript. На самом деле, арифметика с плавающей запятой уже существовала.
с первых дней компьютеров, еще в 1938 году (JavaScript не был создан
до 1995 года).
В 1985 году IEEE стандартизировал плавающие точечная арифметика со стандартом IEEE 754. Стандарт решает множество проблем, возникающих из-за разнообразного набора реализаций с плавающей запятой в различных аппаратных и программных продуктах, и затрудняет надежное и переносимое использование с плавающей запятой.
Числа с плавающей запятой
В науке, когда мы имеем дело с действительно большими числа или очень маленькие числа, обычно эти числа представляются в научная нотация.
Например, постоянная Планка, которая связывает энергию, переносимую фотоном, к частоте фотона, это на самом деле маленькое число. Это:
0,000000000000000000000000006626068
Что в экспоненциальном представлении можно записать как:
6,626068 x 10
-34
Здесь мы перемещаем десятичную точку на 34 разряда, обозначаемую порядком величины
.
Аналогично, постоянная Авогадро, которая связывает количество вещества в
данного образца (измеряемого в молях), к количеству частиц в этом образце — это
602 300 000 000 000 000 000 000
Что в экспоненциальном представлении можно записать как:
6.023 x 10 23
Мы можем обобщить, как написаны научные обозначения:
M x 10 N
, который вы будете читать «M Times Ten, Rail to the to the
. сила н».
Эта научная запись, когда на нее ссылаются в смысле компьютерной арифметики, называется системой с плавающей запятой. в десятичной системе счисления, но мы также можем использовать экспоненциальное представление для представления чисел из двоичной системы счисления, например:
1,001011 x 2 6
Двоичное число, представленное в научной записи. Это формат, в котором хранятся числа с плавающей запятой.
Числа с плавающей запятой — это двоичные числа, записанные в научном формат записи, и именно стандарт IEEE 754 стандартизировал, как эти числа с плавающей запятой будут храниться в памяти.
IEEE 754
Из различных форматов, определенных стандартом IEEE, нас больше всего интересует стандарт двойной точности , поскольку именно его использует JavaScript для хранения всех своих числовых значений. Двойная точность означает, что каждое число хранится в 64-битной памяти, которую мы сейчас разберем.
Графическое изображение того, как числа с плавающей запятой двойной точности хранятся в памяти.
Как вы можете видеть на изображении выше, всего 64 бита используются для хранения числа с плавающей запятой в формате двойной точности. Биты сгруппированы в следующие: 9
1024
)Если вы хотите еще глубже понять, как значения с плавающей запятой хранятся в памяти, ознакомьтесь с этой статьей, которая очень глубока, хотя и немного суховата, или с этой статьей Брайана Ринальди, который отлично резюмирует первую статью и сделать ее более удобоваримой для чтения.
Представление специальных значений
Знаете ли вы, что в JavaScript у вас может быть как положительный нуль, так и отрицательный ноль? В консоли браузера попробуйте ввести -0/1
. Это имеет смысл, когда вы думаете о формате с плавающей запятой и бите, предназначенном для знака. Ноль в плавающей запятой хранится как:
- знак: 0 для положительного нуля, 1 для отрицательного нуля
- показатель степени: все 0 бит
- дробь: все 0 бит
Число бесконечность
в JavaScript также может быть представлено в формате с плавающей запятой.
- знак: 0 для положительной бесконечности, 1 для отрицательной бесконечности
- показатель степени: все 1 бит
- дробь: все 0 бит
NaN
технически хранится как число с плавающей запятой. Вот почему в JavaScript:
typeof NaN === "number" //true
, поскольку технически он хранится как число
. Следовательно, более точное представление о значениях NaN
является недействительным или неправильным — «не число» на самом деле не является истинным в буквальном смысле.
NaN
значения хранятся в следующем формате с плавающей запятой:
- знак: либо 0 бит, либо 1 бит
- показатель степени: все 1 биты0079
Вы могли заметить, что и бесконечность
, и NaN
имеют все 1 биты для показателя степени. Все биты 1 для экспоненты будут преобразованы в 2047 и являются специальными экспонентами для выражения бесконечности
или NaN
.
Обычная ошибка для новых программистов — попытаться ввести безопасно свою функцию, написав:
if (typeof num === "number") { // сделай что-нибудь }
Проблема в том, что, как мы только что видели, NaN
также технически является числом. Правильный способ проверить, является ли что-то числом
:
if (typeof num === "number" && !Number.isNaN(num)) { // сделай что-нибудь }
Значения с плавающей запятой и (не)известные ошибки округления
В десятичной системе счисления у нас есть числа, которые повторяются бесконечно. Например, как бы вы написали 1/3 в виде десятичной дроби?
0,333333333333333333333333333333333333333333333333333333333333333333333333333…
Это просто повторяется бесконечно. Если бы мы произнесли это число вслух, то могли бы сказать: «три целых три три повторяющихся». Это называется повторяющейся десятичной дробью.
Концепция повторяющихся чисел верна во всех системах счисления, включая двоичную. 0.1
— одно из таких чисел, которое в двоичном виде будет повторяться бесконечно. Как вы представляете 0.1
в двоичном формате, спросите вы?
0.0011001100110011001100110011001100110011001100110011001100110011…
Обратите внимание, что 0011
бесконечно повторяется
Вот почему, дамы и господа, 0,1 + 0,2 !== 0,3
, потому что 0.1
необходимо округлить из-за того, что для хранения значения 0.1
имеется только 52 дробных бита.
Другими словами, мы только что сказали, что 0,1
в двоичном виде равно 0,001100110011...
. Что, если бы мы округлили до 5 дробных бит? Это будет 0.0001
, но 0.0001
в двоичном виде на самом деле будет 0.0625
, если преобразовать обратно в десятичное! Это ошибка округления 0,0375
. Если это так, то 0,1 + 0,2
будет равно 0,2625
!
К счастью для нас, как мы видели ранее, для дробной части каждого числа доступно 52 бита, что делает ошибки округления, которые мы видим в JavaScript, относительно небольшими, почти незаметными, хотя все еще присутствующими.
Надеюсь, понятно, почему простые математические операции на первый взгляд кажутся неправильными.
Значения с плавающей запятой в JavaScript
Следует сказать, что почти все это я ссылаюсь на серию книг Кайла Симпсона «Вы не знаете JS». Это удивительная серия, Кайл подробно описывает все части JavaScript, и я очень рекомендую ее.
Все числа в JavaScript хранятся как значения с плавающей запятой. То есть в JavaScript нет понятия различных типов числовых данных, таких как «целое», «плавающее» и «двойное», как в некоторых других языках. Все числа в JavaScript имеют тип числа
. Например:
const a = 42 // Это число, хранящееся в памяти как значение с плавающей запятой. const b = 0.42 // Это также число, хранящееся в памяти как значение с плавающей запятой. const c = 4e100 // Это тоже число, и тоже хранится в памяти как значение с плавающей запятой.
Все эти числа в JavaScript заключены в нативный объект Number
, который дает им доступ к методам прототипа Number
, а также к свойствам нативного объекта Number
.
Для обработки чисел в JavaScript и решения проблемы 0.1 + 0.2 !== 0.3;
, мы можем использовать эти методы.
Наиболее распространенной практикой является использование крошечного значения «ошибки округления» в качестве допуска для сравнения. Это крошечное значение часто называют «машинным эпсилоном», что обычно равно 2 -52 (или 2,220446049250313 x 10 -16 , если быть более точным) для чисел
в JavaScript.
Начиная с ECMAScript 2015, Number.EPSILON
предопределено с этим значением допуска, и мы можем использовать это значение Number. EPSILON
для сравнения двух значений Number
на «равенство». Под «равенством» мы подразумеваем, что оно находится в пределах допуска ошибки округления в JavaScript.
номера функцийCloseEnoughToEqual(n1, n2) { return Math.abs(n1 - n2) < Number.EPSILON } вар а = 0,1 + 0,2 вар б = 0,3 numberCloseEnoughToEqual(a, b) // истина numberCloseEnoughToEqual(0.0000001, 0.0000002) // ложь
Еще один способ сравнить значения в JavaScript и избежать ошибок округления значений с плавающей запятой — использовать пару функций на прототипе Number . В частности, .toFixed(..)
и .toPrecision(..)
.
Оба .toFixed(..)
и .toPrecision(..)
принимают один параметр и выводят строку
представления числа, для которого вызывается функция. Давайте посмотрим на несколько примеров, чтобы показать, что я имею в виду:
.toFixed(..)
;(42). toFixed() // "43" ;(42).toFixed(2) // "43.00" константное число = 42,49 num.toFixed(1) // "42,6" num.toFixed(3) // "42.490"
С помощью метода .toFixed(..)
мы вызываем метод непосредственно для числа и передаем количество дробных цифр, которые мы хотим получить на выходе (то есть , количество знаков после запятой). 0
используется по умолчанию и возвращает целое значение.
Обратите внимание, что на выходе на самом деле строка
; это обычная ошибка для новых программистов, и это важно понимать, потому что делая что-то вроде:
;(1).toFixed() + (0.01).toFixed(1)
Вы можете ожидать, что это будет выполнять математику 1 + 0.1 = 1.01
, но на самом деле вы делаете "1" + "0.1"
, что даст "10.1"
. Это известно как конкатенация строк или объединение двух строк вместе.
toPrecision(..)
аналогично .toFixed(..)
, за исключением того, что он указывает, сколько значащих цифр должно использоваться для представления значения. т.е. общее количество цифр до и после запятой. .toPrecision(..)
по-прежнему выводит значение в виде строки
так же, как toFixed(..)
.
Последний распространенный способ работы с числами в JavaScript и предотвращения ошибок округления с точностью с плавающей запятой — работать только с целыми значениями. Поскольку ошибки округления вступают в силу только с определенными десятичными значениями (например, 0,1), использование целых чисел может свести на нет проблему.
Например, одним из решений, если числа в вашей программе представляют значения в долларах, было бы сохранение ваших значений в центах, а не в долях доллара. Например, $10,60
станет 1060
. Это устраняет проблему потенциальных ошибок округления с плавающей запятой, если вам нужно выполнять математические операции с долларовыми значениями, с компромиссом; что, если вам нужно поддерживать разные валюты, в которых нет центов? - как японская иена или исландская крона.