Как я могу удалить десятичную часть из числа JavaScript?

218

У меня есть результаты деления, и я хочу отбросить десятичную часть полученного числа.

Как я могу это сделать?

JacobTheDev
источник

Ответы:

386

Вы могли бы использовать ...

  • Math.trunc() (усеченная дробная часть, также см. ниже)
  • Math.floor() (округлить вниз)
  • Math.ceil() (округлять)
  • Math.round() (округление до ближайшего целого)

... в зависимости от того, как вы хотели удалить десятичную.

Math.trunc()пока не поддерживается на всех платформах (а именно IE), но вы можете легко использовать polyfill .

Другой метод усечения дробной части с превосходной поддержкой платформы - использование побитового оператора (.eg |0). Побочный эффект использования побитового оператора для числа состоит в том, что он будет рассматривать свой операнд как 32-разрядное целое число со знаком, поэтому удаляя дробный компонент. Имейте в виду, что это также будет искажать числа больше 32 бит.


Вы также можете говорить о неточности десятичного округления с арифметикой с плавающей запятой.

Обязательное чтение - Что должен знать каждый компьютерщик об арифметике с плавающей точкой .

Алекс
источник
29
Имейте в виду , что Math.floor()будет увеличивать числовое значение , когда число отрицательное . Таким образом, Math.floor(-1.2) -> -2пока Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( как упомянуто @FloydPink ) будет отбрасывать десятичную часть, как ожидается, для положительных и отрицательных чисел.
Пол Т. Рокин
1
@ PaulT.Rawkeen Вы также можете использовать побитовый оператор для удаления десятичной части, но имейте в виду, что он также усекает до 32 бит.
Алекс
2
следующее показывает, что этот ответ нестабилен:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Джейк
4
@Jake Результат 2.3*100в javascript таков 229.99999999999997, что кажется, что побитовый оператор делает свою работу правильно в вашем примере.
Чад фон Нау
Есть ли подобное решение |0 которое использует 64-битные целые числа?
Клинт
49

Вы также можете использовать побитовые операторы для усечения десятичного числа.

например

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Побитовые операции значительно более эффективны, чем математические функции. Двойной не битовый оператор также, кажется, немного превосходит битовые операции x | 0и x << 0операции на ничтожно малую величину.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Также стоит отметить, что побитовый оператор not имеет приоритет над арифметическими операциями, поэтому вам может потребоваться заключить вычисления в круглые скобки, чтобы получить ожидаемый результат:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Больше информации о двойном побитовом операторе not можно найти в Double bitwise NOT (~~)

Бреден Штеффаниак
источник
2
Может быть незначительно эффективным. Но я бы предложил функции «Математика», так как они более читабельны.
ashipj
Скорее всего, это не сработает, если целое число не представлено как 32-разрядные целые числа со
Хироки
30

Вы могли бы также сделать

parseInt(a/b)
Хари Пачувеэтил
источник
17
Обратите внимание, что parseIntэто не будет работать надежно для больших чисел, потому что оно работает, сначала преобразовав свой аргумент в строку, а для больших чисел результат будет использовать экспоненциальную запись. Например: var n = 22222222222222222222222; parseInt(n);вернется 2, потому что n.toString()вернется 2.2222222222222223e+22.
2
Это также не использует parseInt()для своей цели, которая состоит в том, чтобы взять число в строке и вернуть a Number.
Алекс
22

Вы также можете показать определенное количество цифр после десятичной точки (здесь 2 цифры), используя следующий код:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string

Махди Гафориан
источник
4
Имейте в виду, что toFixed () возвращает String, а не Number. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Джанмикель Кот
1
Как это ответ в качестве ОП, просящего удалить десятичную часть
Исаак
3
Хотя он возвращает строку, вы можете просто использовать метод Number (), чтобы исправить это .. Number ((15.46974) .toFixed (2))
iPzard
13

Используйте Math.round()функцию.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Навдип Сингх
источник
17
Для полноты, это простой JavaScript, а не запрос.
Дэйв Ньютон,
1
$.round = Math.round;)
Алекс
12

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

(Ответ Алекса лучше; я сделал предположение :)

Дэйв Ньютон
источник
6

С ES2015 доступен Math.trunc () .

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Это не поддерживается в IE11 или ниже, но работает в Edge и любом другом современном браузере.

Чад фон Нау
источник
2
Знаешь какие-нибудь вариации, которые позволяют урезать до X десятичных знаков? Было бы наивно думать, что Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)это сработает?
jamiebarrow
2
Привет, Джейми, похоже, это будет работать в большинстве случаев, но оно подвержено ошибкам с плавающей запятой. например value = 2.3и x = 2вернется 2.29. У меня нет лучшего предложения.
Чад фон Нау
Для меня это звучит как правильный ответ. Нет округления сверху или снизу. Нет проблем с отрицательными числами. Просто отбросьте десятичную. Как вопрос задан.
Энрике Морено Палатка
2

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

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
Helzgate
источник
1

toFixed будет вести себя как раунд.

Для поведения, подобного полу, используйте%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Шахар Х
источник
2
Почему вы чувствуете, что это лучше, чем использовать Math.floor? Ваше решение кажется излишне сложным и медленным. Я не знаю, как работает Math.floor, но я ожидаю, что он будет намного более оптимизирован. Кроме того, мне интересно, может ли ваше решение страдать от ошибок округления с плавающей запятой.
Ханс Рёрдинхолдер,
1

Вот подробное объяснение с помощью вышеприведенных постов:

1. Math.trunc (): используется для удаления тех цифр, за которыми следует точка. Он конвертируется неявно. Но не поддерживается в IE.

Пример:

Math.trunc (10.5) // 10

Math.trunc (-10,5) // -10

Другой альтернативный способ: использование побитового оператора not:

Пример:

х = 5,5

~~ x // 5

2. Math.floor (): используется для определения минимального целочисленного значения. Поддерживается во всех браузерах.

Пример:

Math.floor (10,5) // 10

Math.floor (-10,5) // -11

3. Math.ceil (): используется для получения максимально возможного целочисленного значения. Поддерживается во всех браузерах.

Пример:

Math.ceil (10,5) // 11

Math.ceil (-10,5) // -10

4. Math.round (): округляется до ближайшего целого числа. Поддерживается во всех браузерах.

Пример:

Math.round (10,5) // 11

Math.round (-10,5) // -10

Math.round (10.49) // 10

Math.round (-10,51) // -11

sreepurna
источник
1

Например:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

или

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
Келли К Одри
источник
Я не понимаю, почему у этого ответа нет похвалы, он работает для меня, и он интегрирован в стандарты реагирования / JavaScript
cwiggo
0

Для реализации ES6 используйте что-то вроде следующего:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
Джаред
источник
0

Это для тех, кто хочет запретить пользователям вводить десятичные числа

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>
Масуд Дарвишян
источник
0

Вы можете использовать .toFixed (0), чтобы удалить полную десятичную часть или предоставить число в аргументах, до которого вы хотите усечь десятичную дробь.

Примечание: toFixed преобразует число в строку.

Нихил Камани
источник