it-swarm.com.ru

Преобразование двойного в int в Javascript без округления

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

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

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

47
RSH1

Используйте parseInt().

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

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

var num = 2.9
console.log(num | 0); // 2
115
kubetz

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

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

var truncated = ~~number;

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

edit - В обновлении через некоторое время другой альтернативой трюку ~~ является побитовое ИЛИ значение с нулем:

var truncated = number|0;
47
Pointy

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

parseInt(d, 10);
7
Justin Niessner

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

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


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

5
hugomg

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

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
1
Roland

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

0
1man