3,2K подписчиков

Парочка интересных способов получения целой части вещественного числа в языке Javascript

123 прочитали

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

Парочка интересных способов получения целой части вещественного числа в языке 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/

Мы в VK: Physics.Math.Code