Как x|0 определяет число в JavaScript?
В принятом ответе на мой предыдущий вопрос ( Какой самый быстрый способ генерировать случайное целое число в javascript?) Мне было интересно, как число теряет свои десятичные дроби через символ |
,
Например:
var x = 5.12042;
x = x|0;
Как этот этаж число 5
?
Еще несколько примеров:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
3 ответа
Потому что, согласно спецификациям ECMAScript, операторы побитового вызова ToInt32
на каждое выражение для оценки.
Смотрите 11.10 Бинарные побитовые операторы:
Производство
A : A @B
, где@
является одним из побитовых операторов в вышеприведенных произведениях, оценивается следующим образом:
оценивать
A
,Вызов
GetValue(Result(1))
,оценивать
B
,Вызов
GetValue(Result(3))
,Вызов
ToInt32(Result(2)).
Вызов
ToInt32(Result(4)).
Применить побитовый оператор
@
вResult(5)
а такжеResult(6)
, Результатом является 32-разрядное целое число со знаком.Вернуть
Result(7)
,
Побитовые операторы преобразуют свои аргументы в целые числа (см. http://es5.github.com/). Большинство языков, которые я знаю, не поддерживают этот тип конверсии:
$ python -c "1.0 | 0" Traceback (последний вызов был последним): Файл "", строка 1, в Ошибка типа: неподдерживаемые типы операндов для |: 'float' и 'int' $ ruby -e '1.0 | 0' -e:1:in `': неопределенный метод`|' для 1.0:Float (NoMethodError) $ echo "int main(){1.0|0;}" | gcc -xc -: В функции 'main':: 1: ошибка: недопустимые операнды в двоичном | (есть 'double' и 'int')
При выполнении floor
хотя можно было бы преобразовать аргумент в целое число, это не то, что делает большинство языков, потому что исходный тип является числом с плавающей запятой.
Лучший способ сделать это при сохранении типа данных - перейти на exponent
цифры в mantissa
и обнулить оставшиеся биты.
Если вам интересно, вы можете взглянуть на спецификацию IEEE для чисел с плавающей запятой.