Verifique si un número tiene un lugar decimal / es un número entero

284

Estoy buscando una manera fácil en JavaScript para verificar si un número tiene un lugar decimal (para determinar si es un número entero). Por ejemplo,

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

Respuestas:

822

Usar el módulo funcionará:

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

Tenga en cuenta que esto se basa en el valor numérico del número, independientemente del formato. Trata cadenas numéricas que contienen números enteros con un punto decimal fijo igual que los enteros:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5
Andy E
fuente
10
No rechacé la votación, pero diría que tiene algo que ver con 20.0, todavía tiene un punto decimal y satisface lo anterior. +1 de mí de todos modos por enseñarme algo nuevo :)
Abe Petrillo
77
@Abe: bastante cierto, aunque creo que es poco probable. Es imposible decir si 20.0tiene un punto decimal mediante programación, a menos que se exprese como una cadena. Además, ninguna de las otras soluciones obtuvo un voto negativo por no abordar eso ;-)
Andy E
1
@SREEP: ver comentarios arriba. 0.00 no es 0.00 en JavaScript cuando se representa como un valor numérico. Se puede representar como una cadena ("0.00"), en cuyo caso la pregunta es "verificar si una cadena es un número entero" en lugar de "verificar si un número es un número entero" .
Andy E
3
@Swanidhi: ¿qué quieres decir? ¿Qué no será válido? "10."es un número entero y el resultado será exactamente el mismo que "10"o 10.
Andy E
3
El OP pregunta acerca de verificar si un NÚMERO es un número entero. En ninguna parte menciona cadenas ; en ese sentido, la respuesta de Andy es correcta.
Om Shankar
58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () es parte del estándar ES6 y no es compatible con IE11.

Se devuelve false para NaN, Infinityy no numéricos argumentos mientras x % 1 != 0vuelve verdadera.

le_m
fuente
2
la solución falla para 12.0
Vikas Arora
@VikasArora No, funciona según lo previsto. Number.isInteger(12.0)vuelve true.
le_m
Esta parece que debería ser la respuesta correcta, pero, por desgracia, no funciona para la notación científica, por ejemplo, Number.isInteger('1e3')es false, a pesar de que Number.isInteger(1e3)es cierto. Suponiendo que la intención de la pregunta es encontrar valores no enteros (en lugar de la presencia real de un punto decimal en la representación), entonces el valor de cadena '12 .0 ' debería pasar como representa un número entero, pero de nuevo, Number.isInteger('12.0')es false.
brianmearns
La pregunta de @brianmearns OP es si a numberes completo o no. Si su entrada es una cadena, debe convertirla en una numberprimera, por ejemplo parseFloat(), a través de , por supuesto.
le_m
47

O simplemente podría usar esto para averiguar si NO es un decimal:

string.indexOf(".") == -1;
Ike
fuente
2
Creo que esta es la solución real, ya que esto funciona incluso para XX.0
Deepankar Sarkar
55
convertir a cadena antes de continuar .. es decir: yournumber.toString.indexOf(".")
Daniel Omine
1
francisco_ssb ... el símbolo de punto es universal ... representa el lugar decimal en el lenguaje matemático ... esto es universal y debería funcionar en cualquier país. Si habla de comas (","), debe convertir al punto (".") Antes del índice de ("."), Obviamente ...
Daniel Omine
1
Creo que cuando quiso decir que no funciona en algunos países, se refiere a la moneda, ya que el euro usa una coma en lugar de un punto decimal. Sin embargo, la pregunta no es específica de la moneda, solo decimales ... como en una fracción de un número.
Tessa
1
Esto no funciona si el decimal es 1.00 y desea que sea un int a menos que coaccione el valor
simon-pr
21

La solución más común es quitar la parte entera del número y compararlo con cero de la siguiente manera:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}
Thomas
fuente
31
¿Por qué no solo startVal != Math.floor(startVal)?
Andy E
2
Agradable. El mismo concepto, pero su versión es aún más limpia.
Thomas
1
@ Andy E: Esto es posible solo para números positivos. No funcionará para números negativos ..
Seeya K
3
@SeeyaK: por supuesto, funcionará para números negativos. Por favor, siéntase libre de probarlo.
Andy E
1
@DeepakGoyal - Eso es por diseño. La Math.Floorfunción toma un valor decimal y el valor decimal más grande permitido en JavaScript es 2^53 - 1o 9007199254740991. Como 893144042145698745.3es mayor que este máximo, la función fallará.
Thomas
20

Simple, pero efectivo!

Math.floor(number) === number;
dYale
fuente
44
@OmShankar eficiente! = Efectivo
Violín
Math.floor(3.0) == 3.0es cierto, Math.floor(3.3) == 3.3es falso
Rohmer
@Fiddles, oh cierto, eso es lo que quería decir: no es eficiente ya que esto es mucho más lento en rendimiento en comparación con el método% mod. Gracias por corregir
Om Shankar
19

// ¿Qué hay de byte-it?

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

Siempre me siento mal por los operadores de bits en javascript

apenas hacen ejercicio.

Kennebec
fuente
14
Eso falla para enteros mayores que 2 ^ 31 - 1, porque >>convierte el valor en un entero de 32 bits con signo .
Matthew Crumley
1
@kennebec impresionante: esa es, con mucho, la solución más divertida. Y es muchísimo mejor que un RegEx.
Daniel B. Chapman
5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

¡Bastante genial y funciona para cosas como XX.0 también! Funciona porque Math.floor () corta cualquier decimal si tiene uno, así que si el piso es diferente del número original, ¡sabemos que es un decimal! Y sin conversiones de cadena :)


fuente
4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);
ghostdog74
fuente
44
Falla por num= 999999999999999999999.
bobince
1
convertir a cadena primero y luego hacer la re.
ghostdog74
Funcionó para mí sin convertir en cadena.
Abe Petrillo
4

Number.isInteger()Es probablemente el más conciso. Devuelve verdadero si es un número entero y falso si no lo es.

Christopher Connery
fuente
1
Esta debería ser la respuesta aceptada, porque es mejor que usar el módulo debido a los problemas de la cadena.
Ini
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;
}
Vitor Lins
fuente
No necesita una explicación. Es muy simple
Grant Birchmeier
1
Si la cadena contiene alguno de los valores en strCheck, es un decimal ... (se está perdiendo. Y, sin embargo ...
NicoJuicy
2
parseInt(num) === num

cuando se pasa un número, parseInt()solo devuelve el número como int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true
Miguel
fuente
44
Este me gusta mucho, pero depende de las necesidades específicas de cada uno. Desafortunadamente, necesito una función para FALLAR la pruebaparseInt(3.0) === 3.0 // true
zipzit
2

convertir cadena de número a matriz, dividido por punto decimal. Entonces, si la matriz tiene solo un valor, eso significa que no hay decimal en la cadena.

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

De esta manera, también puede saber cuáles son realmente el número entero y el decimal. Un ejemplo más avanzado sería.

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

if(!dece){
    //do stuff
}
Kareem
fuente
1

Aquí hay un extracto de mi biblioteca de guardia (inspirado en JavaScript efectivo por David Herman):

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
Schirrmacher
fuente
1

Puede multiplicarlo por 10 y luego hacer una operación / división de " módulo " con 10 , y verificar si el resultado de esas dos operaciones es cero. El resultado de esas dos operaciones le dará el primer dígito después del punto decimal. Si el resultado es igual a cero, entonces el número es un número entero.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}
BSevo
fuente
1
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}
Steve Brush
fuente
1

Puede usar las operaciones bit a bit que no cambian el valor ( ^ 0o ~~) para descartar la parte decimal, que puede usarse para redondear. Después de redondear el número, se compara con el valor original:

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

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true
makovkastar
fuente
1
function isWholeNumber(num) {
  return num === Math.round(num);
}
Dmitry Shashurov
fuente
1

Puede usar la siguiente función para verificar si un número tiene decimales:

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

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

Aparentemente, algunos usuarios quieren explicaciones. Lo partiré en pedazos: (num% 1)

Paréntesis significa realizar esas operaciones primero. num - una variable pasada por la función. %: un símbolo de módulo que intenta dividir el número izquierdo por el derecho. Si hay un resto, lo devuelve como un decimal. Si se divide de manera uniforme, devuelve 0.

Entonces, resume lo que tenemos hasta ahora, (num% 1) devolverá:

0 cuando se divide equitativamente O #. ##### si no

0 == falso.

[ANY_NUMBER_NOT_ZERO] == verdadero.

Ejemplos: nuevo booleano (0) es falso nuevo booleano (12312.1231) es verdadero

Otras alternativas: Un usuario podría haber intentado devolver el valor de (num% 1), que básicamente lograría lo mismo. Dado que return (0) es falso y return (1.213113) es verdadero.

Pero quería devolver un valor booleano. Entonces, como atajo para forzar un valor en un valor booleano, agregué un! símbolo delante de él.

¡Todos los que puedan saber! significa NO. Pero también fuerza un valor a un valor booleano.

Desde el! symobol fuerza el valor en un valor booleano e invierte su valor. Yo suelo !! para forzar el valor a un valor booleano e invertir su valor nuevamente a su valor booleano original.

ingrese la descripción de la imagen aquí

twalow
fuente
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Nic3500
0

La función para el número de cheque es decimal o número entero

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}
usuario3897934
fuente
0

Tal vez esto funciona para ti?

Utiliza regex para verificar si hay una coma en el número, y si no la hay, agregará la coma y la franja.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);
usuario11608734
fuente
Bienvenido a StackOverflow. ¿Podría explicar qué hace este código y por qué cree que resolverá el problema?
quinz
@quinz Utiliza expresiones regulares para verificar si hay una coma en el número, y si no la hay, agregará la coma y la franja. Por lo tanto, hace lo que pide la pregunta con la funcionalidad adicional de agregar el formato para etiquetas de precio redondeadas.
user11608734
0

Use el siguiente si el valor es una cadena (por ejemplo, de <input):

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

Agrego .toString()al piso para que funcione también para casos cuando value == "1."(termina con un separador decimal u otra cadena). También Math.floorsiempre devuelve algún valor, por lo que .toString()nunca falla.

michal.jakubeczy
fuente