#javascript #integer
#javascript #целое
Вопрос:
Прямо сейчас я использую эту функцию, чтобы определить, является ли число целым числом:
function isInteger(input){
return (input%1==0);
}
есть ли более эффективный способ сделать это? Я знаю, что для этого есть встроенная функция javascript, но она не работает в определенных версиях IE.
Комментарии:
1. Вот более эффективный способ сделать это: ссылка
2. может быть, вы хотите использовать
return typeof input === 'number'
, это поддерживается IE, проверьте MDN3. @VitaliiStrimbanu число не обязательно является целым числом, например, посмотрите на
3.14
.4. @vlaz спасибо, что указали на это, мой плохой.
Ответ №1:
Согласно jsPerf, ~~
(повторяется побитово НЕ) и << 0
(сдвиг влево на 0 бит) выполняются быстрее в моем браузере:
function isInteger(input) {
return (~~input === input);
}
function isInteger2(input) {
return (input << 0 === input);
}
ПРЕДУПРЕЖДЕНИЕ: побитовые операторы JavaScript приводят свои операнды к 32-разрядным целым числам со знаком, поэтому этот метод безопасен только для чисел до
Math.pow(2, 31) -1
(2147483647). Используйте другой метод, если вы не можете этого гарантировать.
Из других методов n % 1 === 0
и Math.floor(value) === value
на 40-50% медленнее и Number.isInteger
сильно отстают.
Однако все они выполняются «довольно быстро». Если вам не нужно проверять много чисел, ни один из этих методов, скорее всего, не будет узким местом в вашем приложении.
Комментарии:
1. ПОБИТОВОЕ
NOT
ИСПОЛЬЗОВАНИЕ ОПАСНО! Побитовая числовая арифметика обрабатывает любое число как 32-битное, поэтому при больших числах вы получите переполнение~~10000000000// 1410065408
Ответ №2:
function isInteger(input){
Number.isInteger(input)
}
Number.isInteger = Number.isInteger || function(value) {
return typeof value === "number" amp;amp;
isFinite(value) amp;amp;
Math.floor(value) === value;
};
Ответ №3:
function isInt(val) {
return val 0 === val;
}
Комментарии:
1. Но
1.5 0 === 1.5