Парочка интересных способов получения целой части вещественного числа в языке 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 }
➡️
https://jsfiddle.net/87fza9rs/19/ ⬅️
#js #javascript