Как я могу проверить, что число с плавающей запятой или целое число? - PullRequest
668 голосов
/ 08 октября 2010

Как узнать, что число float или integer?

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

Ответы [ 41 ]

1165 голосов
/ 08 октября 2010

проверка остатка при делении на 1:

function isInt(n) {
   return n % 1 === 0;
}

Если вы не знаете, что аргумент является числом, вам нужно два теста:

function isInt(n){
    return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}
146 голосов
/ 08 октября 2010

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

function isFloat(n) {
    return n === +n && n !== (n|0);
}

function isInteger(n) {
    return n === +n && n === (n|0);
}
89 голосов
/ 28 ноября 2011

Почему бы не что-то вроде этого:

var isInt = function(n) { return parseInt(n) === n };
58 голосов
/ 26 декабря 2013

Существует метод под названием Number.isInteger(), который в настоящее время реализован только в последней версии Firefox и все еще является частью предложения EcmaScript 6.Однако MDN предоставляет полифил для других браузеров, который соответствует тому, который указан в гармонии ECMA:

if (!Number.isInteger) {
  Number.isInteger = function isInteger (nVal) {
    return typeof nVal === "number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal;
  };
}
33 голосов
/ 24 апреля 2012

Вы можете использовать простое регулярное выражение:

function isInt(value) {

    var er = /^-?[0-9]+$/;

    return er.test(value);
}

Или вы можете использовать нижеприведенные функции в соответствии с вашими потребностями. Они разработаны PHPJS Project .

is_int() => Проверить, является ли тип переменной целочисленным и имеет ли ее содержимое целое число

is_float() => Проверить, является ли тип переменной float и имеет ли она содержимое float

ctype_digit() => Проверить, является ли тип переменной строковым и содержит ли она только десятичные цифры

Обновление 1

Теперь он проверяет и отрицательные числа, спасибо за @ комментарий ChrisBartley !

18 голосов
/ 18 июля 2011

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

function isNumber(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    if (typeof value == 'number') {
        return true;
    }
    return !isNaN(value - 0);
}

И для целых чисел (вернул бы false, если значение является плавающим):

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}

Эффективность здесь заключается в том, что parseInt (или parseNumber) избегают, когда значение уже является числом. Обе функции синтаксического анализа всегда сначала преобразуются в строку, а затем пытаются проанализировать эту строку, что будет бесполезно, если значение уже является числом.

Спасибо другим постам здесь за предоставление новых идей для оптимизации!

11 голосов
/ 08 мая 2014
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }

// give it a spin

isInteger(1.0);        // true
isFloat(1.0);          // false
isFloat(1.2);          // true
isInteger(1.2);        // false
isFloat(1);            // false
isInteger(1);          // true    
isFloat(2e+2);         // false
isInteger(2e+2);       // true
isFloat('1');          // false
isInteger('1');        // false
isFloat(NaN);          // false
isInteger(NaN);        // false
isFloat(null);         // false
isInteger(null);       // false
isFloat(undefined);    // false
isInteger(undefined);  // false
9 голосов
/ 12 февраля 2013
function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

работает для всех случаев.

6 голосов
/ 08 октября 2010

Как уже упоминалось, у вас есть только двойники в JS.Итак, как вы определяете число, являющееся целым числом?Просто проверьте, равно ли округленное число себе:

function isInteger(f) {
    return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }
6 голосов
/ 20 мая 2013

Вот что я использую для целых чисел:

Math.ceil(parseFloat(val)) === val

Коротко, приятно :) Работает постоянно. Вот что предлагает Дэвид Фланаган, если я не ошибаюсь.

...