Преобразование двойного в int в Javascript без округления - PullRequest
49 голосов
/ 05 декабря 2011

В C # следующий код возвращает 2:

double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);

Однако в Javascript единственный способ преобразовать «double» в «int», о котором я знаю, - это использовать Math.round / floor / toFixed и т.д. Есть ли способ конвертировать в int в Javascript без округления?Мне известно о влиянии Number () на производительность, поэтому я бы предпочел не преобразовывать его в строку, если это вообще возможно.

Ответы [ 6 ]

128 голосов
/ 05 декабря 2011

Использование parseInt().

var num = 2.9
console.log(parseInt(num, 10)); // 2

Вы также можете использовать |.

var num = 2.9
console.log(num | 0); // 2
49 голосов
/ 05 декабря 2011

Я нахожу предложения "parseInt" довольно любопытными, потому что "parseInt" работает с строками по своему замыслу. Вот почему в его названии есть слово "parse".

Трюк, который полностью избегает вызова функции:

var truncated = ~~number;

Двойное применение унарного оператора "~" предоставит вам усеченную версию значения двойной точности. Однако значение ограничено 32-битной точностью, как и во всех других операциях JavaScript, которые неявно предполагают, что числа считаются целыми числами (например, индексация массива и побитовые операторы).

edit & mdash; Через некоторое время в обновлении другой альтернативой уловке ~~ является побитовое ИЛИ значение с нулем:

var truncated = number|0;
7 голосов
/ 05 декабря 2011

Просто используйте parseInt() и обязательно включите основание, чтобы получить предсказуемые результаты:

parseInt(d, 10);
5 голосов
/ 05 декабря 2011

В Javascript нет такой вещи, как int.Все Numbers на самом деле удваиваются за кулисами *, поэтому вы не можете полагаться на то, что система типов выдаст за вас порядок округления, как в C или C #.

Вам не нужно беспокоиться овопросы точности (поскольку удвоения правильно представляют любое целое число до 2 ^ 53), но вы действительно застряли с использованием Math.floor (или других эквивалентных приемов), если хотите округлить до ближайшего целого числа.


* Большинство движков JS используют собственные целочисленные значения, когда они могут, но все числа JS по-прежнему должны иметь двойную семантику.

1 голос
/ 18 октября 2018

Аналогично приведению C # к (int) с использованием только стандартной библиотеки lib:

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
0 голосов
/ 27 декабря 2018

Как отметили @Quentin и @Pointy в своих комментариях, не рекомендуется использовать parseInt(), поскольку он предназначен для преобразования строки в целое число.Когда вы передаете ему десятичное число, оно сначала преобразует число в строку, а затем преобразует его в целое число.Я предлагаю вам использовать Math.trunc(), Math.floor(), ~~num, ~~v, num | 0, num << 0 или num >> 0 в зависимости от ваших потребностей. Этот тест производительности демонстрирует разницу в производительности parseInt() и Math.floor().Также этот пост объясняет разницу между предлагаемыми методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...