Проверьте, имеет ли число десятичное место / является целым числом


284

Я ищу простой способ в JavaScript, чтобы проверить, если число имеет десятичное место в нем (чтобы определить, является ли оно целым числом). Например,

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}

Ответы:


822

Использование модуля будет работать:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

Обратите внимание, что это основано на числовом значении числа, независимо от формата. Он обрабатывает числовые строки, содержащие целые числа с фиксированной десятичной точкой, так же, как целые числа:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

10
Я не голосовал против, но я бы сказал, что это как-то связано с 20.0, все еще имеет десятичную точку и удовлетворяет вышеуказанному. +1 в любом случае от меня за то, что научил меня чему-то новому :)
Абе Петрильо

7
@Abe: достаточно верно, хотя я думаю, что это маловероятно. Невозможно сказать, 20.0имеет ли десятичная точка программно, если она не выражена в виде строки. Кроме того, ни одно из других решений не получило отрицательного ответа за то, что не занялось этим ;-)
Энди Э

1
@SREEP: см. Комментарии выше. 0,00 не 0,00 в JavaScript, когда представлено в виде числового значения. Он может быть представлен в виде строки («0,00»), в этом случае вопрос для этого «проверить , является ли строка целым числом» вместо «проверить, является ли число целым числом» .
Энди Э

3
@Swanidhi: что ты имеешь в виду? Что не будет действительным? "10."является целым числом, и результат будет точно таким же, как "10"или 10.
Энди Э

3
ОП просит проверить, является ли НОМЕР целым числом. Он нигде не упоминает последовательности - в этом отношении, ответ Энди является правильным.
Ом Шанкар

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () является частью стандарта ES6 и не поддерживается в IE11.

Она возвращает ложные для NaN, Infinityи не числовых аргументов в то время как x % 1 != 0возвращает истину.


2
решение не удается для 12.0
Викас Арора

@VikasArora Нет, все работает как задумано. Number.isInteger(12.0)возвращается true.
le_m

Кажется, что это должен быть правильный ответ, но, к сожалению, он не работает для научной нотации, например, Number.isInteger('1e3')есть false, хотя Number.isInteger(1e3)это правда. Предполагая, что цель вопроса состоит в том, чтобы найти нецелые значения (а не фактическое присутствие десятичной точки в представлении), тогда строковое значение «12 .0» должно пройти, поскольку оно представляет целое число, но опять-таки Number.isInteger('12.0')есть false.
brianmearns

Вопрос @brianmearns OP в том, является ли a numberцелым или нет. Если вы вводите строку, вам нужно преобразовать ее в numberпервую, например, через parseFloat(), конечно.
le_m

47

Или вы можете просто использовать это, чтобы узнать, не является ли это десятичным числом:

string.indexOf(".") == -1;

2
Я думаю, что это реальное решение, так как это работает даже для XX.0
Дипанкар Саркар

5
преобразовать в строку, прежде чем продолжить .. т.е.: yournumber.toString.indexOf(".")
Даниэль Омин

1
francisco_ssb .. символ точки универсален ... представляет десятичный знак в математике ... это универсально и должно работать в любой стране. Если вы говорите о запятых (","), вы должны преобразовать в точку (".") Перед indexOf ("."), Очевидно ..
Даниэль Омин

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

1
Это не работает, если десятичное число равно 1,00, и вы хотите, чтобы оно было целым числом, если вы не приводите значение
simon-pr

21

Наиболее распространенным решением является удаление целой части числа и сравнение ее с нулем следующим образом:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

31
Почему не просто startVal != Math.floor(startVal)?
Энди Э

2
Ницца. Та же концепция, но ваша версия еще чище.
Томас

1
@ Энди Э: Это возможно только для положительных чисел. Это не будет работать для отрицательных чисел ..
Seeya K

3
@SeeyaK: конечно, это будет работать для отрицательных чисел. Пожалуйста, не стесняйтесь попробовать.
Энди Э,

1
@DeepakGoyal - это дизайн. Math.FloorФункция принимает значение десятичного и наибольшее значение десятичного допускается в JavaScript является 2^53 - 1или 9007199254740991. Так 893144042145698745.3как больше этого максимума, функция не будет выполнена.
Томас

20

Простой, но эффективный!

Math.floor(number) === number;

4
@OmShankar эффективный = эффективный!
скрипках

Math.floor(3.0) == 3.0верно, Math.floor(3.3) == 3.3неверно
Rohmer

@ Fiddles, да, вот что я хотел сказать: неэффективно, так как это намного медленнее по сравнению с методом% mod. Спасибо за исправление
Ом Шанкар

19

// Как насчет этого?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

Я всегда чувствую себя плохо для битовых операторов в javascript-

они вряд ли получают какое-либо упражнение.


14
Это не работает для целых чисел больше 2 ^ 31 - 1, потому что >>преобразует значение в 32-разрядное целое число со знаком .
Мэтью Крамли

1
@kennebec потрясающе - это, безусловно, самое забавное решение. И это намного лучше, чем RegEx.
Даниэль Б. Чепмен

5
number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

Довольно круто и работает на такие вещи, как XX.0 тоже! Это работает, потому что Math.floor () отбирает любое десятичное число, если оно есть, поэтому, если слово отличается от исходного числа, мы знаем, что это десятичное число! И без преобразования строк :)


4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

4
Терпит неудачу за num= 999999999999999999999.
bobince

1
сначала преобразуйте в строку, а затем выполните re.
ghostdog74

Работал для меня без преобразования в строку.
Абе Петрильо

4

Number.isInteger()наверное, самый лаконичный. Он возвращает истину, если это целое число, и ложь, если это не так.


1
Это должен быть принятый ответ, потому что лучше использовать модуль из-за проблем со строками.
Ини

3
function isDecimal(n){
    if(n == "")
        return false;

    var strCheck = "0123456789";
    var i;

    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

Не нуждается в объяснении. Это довольно просто.
Грант Бирчмайер

1
Если строка содержит любое из значений в strCheck, это десятичное число ... (он отсутствует на. И, хотя ...
NicoJuicy

2
parseInt(num) === num

когда передано число, parseInt()просто возвращает число как int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

4
Мне это очень нравится, но зависит от конкретных потребностей. К сожалению, мне нужна функция, чтобы parseInt(3.0) === 3.0 // true
провалить

2

преобразовать числовую строку в массив, разделить на десятичную точку Затем, если массив имеет только одно значение, это означает отсутствие десятичного числа в строке.

if(!number.split(".")[1]){
    //do stuff
}

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

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

1

Вот отрывок из моей охранной библиотеки (вдохновлен Effective JavaScript Дэвидом Херманом):

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

1

Вы можете умножить его на 10, а затем выполнить операцию / деление по модулю на 10 и проверить, равен ли результат этих двух операций нулю. Результат этих двух операций даст вам первую цифру после десятичной точки. Если результат равен нулю, то число является целым числом.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}


1

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

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true


1

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

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

По-видимому, некоторые пользователи хотят объяснений. Я разобью его на части: (num% 1)

Скобки означают выполнение этих операций в первую очередь. num - переменная, переданная функцией. % - символ модуля, который пытается разделить левое число на правое. Если есть остаток, он возвращает его в виде десятичной дроби. Если он делится равномерно, он возвращает 0.

Итак, подытожим то, что у нас есть. (Num% 1) вернет:

0 при равномерном делении ИЛИ #. ##### если нет

0 == неверно.

[ANY_NUMBER_NOT_ZERO] == верно.

Примеры: new Boolean (0) равен false new Boolean (12312.1231) равен true

Другие альтернативы: пользователь мог попытаться вернуть значение (num% 1)., Что в основном позволило бы достичь того же. Поскольку return (0) является ложным, а return (1.213113) истинным.

Но я хотел вернуть логическое значение. Чтобы добавить значение в логическое значение, я добавил! символ перед ним.

Столько, сколько может знать. значит НЕ. Но это также превращает значение в логическое значение.

С тех пор! symobol переводит значение в логическое значение и инвертирует его значение. Я использую !! заставить значение в логическое значение и инвертировать его значение обратно к исходному логическому значению.

введите описание изображения здесь


Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Nic3500

0

Функция для контрольного номера является десятичным или целым числом

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}

0

Возможно, это работает для вас?

Он использует регулярные выражения, чтобы проверить, есть ли запятая в числе, и если нет, то он добавит запятую и полосу.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

Добро пожаловать в StackOverflow. Не могли бы вы рассказать, что делает этот код и почему вы думаете, что он решит проблему.
Quinz

@quinz Использует регулярное выражение, чтобы проверить, есть ли запятая в числе, а если нет, то добавит запятую и полосу. Таким образом, он делает то, о чем просит вопрос, с добавленной функциональностью добавления форматирования для округленных ценников.
user11608734

0

Используйте следующее, если значением является строка (например, from <input):

Math.floor(value).toString() !== value

Я добавляю .toString()слово floor, чтобы оно работало и в тех случаях, когда value == "1."(заканчивается десятичным разделителем или другой строкой) Также Math.floorвсегда возвращает некоторое значение, поэтому .toString()никогда не завершается ошибкой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.