Найти тему
Репетитор IT mentor

Как получить целую часть числа в JavaScript

Оглавление

Парочка интересных способов получения целой части вещественного числа в языке Javascript. Допустим, у нас есть вещественное double число
var n = 1234.567; Нужно получить только целую часть от него, т. е. 1234.

1 способ

Самый банальный. Использовать средства библиотеки Math.
Math.floor(n); Метод Math.floor() возвращает наибольшее целое число, которое меньше или равно данному числу. Поэтому при применении полностью отбрасывается дробная часть.

2 способ

Изящная работа со строкой, полученной из числа.
((n + "").split("."))[0]; Конкатенация числа и пустой строки возвращает из числа 1234.567 строку "1234.567". Затем для строки используется метод split(), принимающий в качестве параметра разделитель-точку, метод split() возвращает массив/список слов, полученных по разделителю. В нашем случае у нас всегда получится два слова. Далее мы получаем целую часть, обращаясь к первому слову по нулевому индексу. Правда оно остается строкой, но это легко изменить, обернув данное выражение в метод parseInt(). Функция parseInt(string, radix) принимает строку в качестве аргумента и возвращает целое число в соответствии с указанным основанием системы счисления radix. Удобство в том, что вместо точки может стоять запятая, которую легко применить в методы split(). Таким образом, число 1234 можно получить так:
parseInt(((n + "").split("."))[0], 10)

3 способ

Простое использование метода parseInt(n, 10);
Также возвращает целую часть. Однако, в некоторых версиях может выполнить нежелательно округление вверх.

4 способ

Использование побитовых операций. n ^ 0;
Так как побитовые операции в JS определены только для целых чисел, то на низком уровне отбрасывается дробная часть, а операция исключающего или
(XOR, ^) некоторого числа n вместе с нулем дает именно это число n. Только без дробной части.

5 способ

Двойное побитовое отрицание (инверсия). ~~n;
Преимущества: самый быстрый способ отбрасывания дробной части вещественного числа. Побитовые операции в Javascript работают со знаковыми (signed) целыми (integer) длиной в 32 бита (оператор > > работает с unsigned). Иными словами, побитовые операторы интерпретируют операнды как последовательность из 32 битов.
Таким образом,
1234 в двоичном коде будет равно:
0000 0000 0000 0000 0000 0100 1101 0010
Его побитовая инверсия
~1234 в двоичном коде будет равна:
1111 1111 1111 1111 1111 1011 0010 1101 (2) —> -1235 (10)
А побитовая инверсия побитовой инверсии равна:
~~1234 = ~(~1234) = ~(-1235):
0000 0000 0000 0000 0000 0100 1101 0010 (2) —> 1234 (10)
т.е. получили исходное число, только с отброшенной частью после плавающей точки.

Благодаря свойству инвертирования и представления чисел в дополнительном коде, тождество
-1235 + 1 = -1234 мы можем в общем случае записать как (~n + 1) == - n или ~n == - (n + 1)
Данное выражение можно использовать в логической ветке, когда нужно сделать некоторые действия, если
n != -1 (или экранировать какой-то блок в случае если переменная-флаг равна -1 :
if( ~n ){ //зайдет в эту ветку только, если n != -1 }

Попробовать работу всех способов в онлайн-сервисе JSFiddle

Знаете еще интересные лайфхаки? Пишите о них в комментариях!

Еще много полезного и интересного вы сможете найти на ресурсах:

Репетитор IT mentor в VK

Репетитор IT mentor в Instagram

Physics.Math.Code в контакте (VK)

Physics.Math.Code в telegram

Physics.Math.Code в YouTube