У меня есть результаты деления, и я хочу отбросить десятичную часть полученного числа.
Как я могу это сделать?
У меня есть результаты деления, и я хочу отбросить десятичную часть полученного числа.
Как я могу это сделать?
Ответы:
Вы могли бы использовать ...
Math.trunc() (усеченная дробная часть, также см. ниже)Math.floor() (округлить вниз)Math.ceil() (округлять) Math.round() (округление до ближайшего целого)... в зависимости от того, как вы хотели удалить десятичную.
Math.trunc()пока не поддерживается на всех платформах (а именно IE), но вы можете легко использовать polyfill .
Другой метод усечения дробной части с превосходной поддержкой платформы - использование побитового оператора (.eg |0). Побочный эффект использования побитового оператора для числа состоит в том, что он будет рассматривать свой операнд как 32-разрядное целое число со знаком, поэтому удаляя дробный компонент. Имейте в виду, что это также будет искажать числа больше 32 бит.
Вы также можете говорить о неточности десятичного округления с арифметикой с плавающей запятой.
Обязательное чтение - Что должен знать каждый компьютерщик об арифметике с плавающей точкой .
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100в javascript таков 229.99999999999997, что кажется, что побитовый оператор делает свою работу правильно в вашем примере.
|0 которое использует 64-битные целые числа?
Вы также можете использовать побитовые операторы для усечения десятичного числа.
например
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 (~~)
Вы могли бы также сделать
parseInt(a/b)
parseIntэто не будет работать надежно для больших чисел, потому что оно работает, сначала преобразовав свой аргумент в строку, а для больших чисел результат будет использовать экспоненциальную запись. Например: var n = 22222222222222222222222; parseInt(n);вернется 2, потому что n.toString()вернется 2.2222222222222223e+22.
parseInt()для своей цели, которая состоит в том, чтобы взять число в строке и вернуть a Number.
Вы также можете показать определенное количество цифр после десятичной точки (здесь 2 цифры), используя следующий код:
var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string
Используйте Math.round()функцию.
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round;)
Использование Math.round().
(Ответ Алекса лучше; я сделал предположение :)
С 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 и любом другом современном браузере.
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)это сработает?
value = 2.3и x = 2вернется 2.29. У меня нет лучшего предложения.
Если вы не заботитесь о маршрутизации, просто преобразуйте число в строку, а затем удалите все после периода, включая период. Это работает независимо от того, есть ли десятичное число или нет.
const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
toFixed будет вести себя как раунд.
Для поведения, подобного полу, используйте%:
var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Вот подробное объяснение с помощью вышеприведенных постов:
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
Например:
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
Это для тех, кто хочет запретить пользователям вводить десятичные числа
<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>
Вы можете использовать .toFixed (0), чтобы удалить полную десятичную часть или предоставить число в аргументах, до которого вы хотите усечь десятичную дробь.
Примечание: toFixed преобразует число в строку.
Math.floor()будет увеличивать числовое значение , когда число отрицательное . Таким образом,Math.floor(-1.2) -> -2покаMath.floor(1.2) -> 1.parseInt(-1.2) -> -1( как упомянуто @FloydPink ) будет отбрасывать десятичную часть, как ожидается, для положительных и отрицательных чисел.