499

I am looking for an easy way in JavaScript to check if a number has a decimal place in it (in order to determine if it is an integer). For instance,

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

24 Answers 24

1244

Using modulus will work:

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

Note that this is based on the numerical value of the number, regardless of format. It treats numerical strings containing whole numbers with a fixed decimal point the same as integers:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5
19
  • 18
    I didn't down vote but I'd say its something to do with 20.0, still has a decimal point and satisfies the above. +1 from me anyway for teaching me something new :) Commented Sep 1, 2011 at 16:53
  • 7
    @Abe: true enough, though I think that's unlikely. It's impossible to say if 20.0 has a decimal point programmatically, unless it is expressed as a string. Also, none of the other solutions got a down vote for not tackling that ;-)
    – Andy E
    Commented Sep 1, 2011 at 16:58
  • 1
    @SREEP: see comments above. 0.00 isn't 0.00 in JavaScript when represented as a number value. It can be represented as a string ("0.00"), in which case the question for that is "check if a string is a whole number" instead of "check if a number is a whole number".
    – Andy E
    Commented Aug 15, 2013 at 16:23
  • 3
    @Swanidhi: what do you mean? What won't be valid? "10." is a whole number and the result will be exactly the same as "10" or 10.
    – Andy E
    Commented Dec 5, 2014 at 16:56
  • 5
    The OP asks about checking if a NUMBER is a whole number. He nowhere mentions strings - in that regards, Andy's answer is right.
    – Om Shankar
    Commented May 2, 2016 at 0:20
165
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger() is part of the ES6 standard and not supported in IE11.

It returns false for NaN, Infinity and non-numeric arguments while x % 1 != 0 returns true.

6
  • 10
    solution fails for 12.0 Commented May 21, 2018 at 9:01
  • 6
    @VikasArora No, it works as intended. Number.isInteger(12.0) returns true.
    – le_m
    Commented May 21, 2018 at 19:59
  • 2
    @brianmearns OP's question is whether a number is whole or not. If your input is a string, you need to convert it into a number first e.g. via parseFloat(), of course.
    – le_m
    Commented Apr 22, 2019 at 11:43
  • 2
    This won't work if there are too many decimal places: Number.isInteger(2.000000000000000000001) // true
    – dYale
    Commented Mar 22, 2021 at 18:36
  • 9
    @dYale This is because 2.000000000000000000001 === 2 in JavaScript
    – le_m
    Commented Mar 22, 2021 at 21:44
74

Or you could just use this to find out if it is NOT a decimal:

string.indexOf(".") == -1;
11
  • 3
    I think this one is the actual solution as this this working even for XX.0 Commented Dec 20, 2014 at 13:36
  • 12
    convert to string before proceed.. ie: yournumber.toString.indexOf(".") Commented Sep 21, 2015 at 5:43
  • 1
    francisco_ssb.. the point symbol is universal... represents the decimal place in math language.. this is universal and should work in any country. If you talking about commas (","), you must convert to point (".") before the indexOf("."), obviously.. Commented Sep 21, 2015 at 7:18
  • 1
    I think when he meant it doesn't work in some countries, he's referring to currency, as the Euro uses a comma instead of a decimal point. However, the question isn't specific to currency, just decimals... as in a fraction of a number.
    – AuRise
    Commented Apr 13, 2016 at 14:21
  • 3
    This doesn't work if decimal is 1.00 and you want it to be an int unless you coerce value
    – simon-p-r
    Commented Jun 15, 2016 at 10:12
37

Simple, but effective!

Math.floor(number) === number;
3
  • 7
    @OmShankar efficient != effective
    – Fiddles
    Commented Jul 5, 2017 at 15:43
  • 7
    Math.floor(3.0) == 3.0 is true, Math.floor(3.3) == 3.3 is false Commented Jan 14, 2018 at 4:59
  • @Fiddles, oh right, that's what I wanted to say: Not efficient as this is much slower in performance in comparison to % mod method. Thanks for correcting
    – Om Shankar
    Commented Jul 29, 2018 at 23:51
32
Number.isSafeInteger(value);

In JavaScript, isSafeInteger() is a Number method that is used to return a Boolean value indicating whether a value is a safe integer. This means that it is an integer value that can be exactly represented as an IEEE-754 double precision number without rounding.

0
24

The most common solution is to strip the integer portion of the number and compare it to zero like so:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}
11
  • 38
    Why not just startVal != Math.floor(startVal)?
    – Andy E
    Commented Feb 21, 2010 at 10:39
  • 4
    Nice. Same concept, but your version is even cleaner.
    – Thomas
    Commented Feb 21, 2010 at 15:56
  • 1
    @Andy E: This is possible only for positive numbers. It won't work for negative numbers..
    – Seeya K
    Commented Apr 25, 2013 at 4:27
  • 3
    @SeeyaK: of course it will work for negative numbers. Please feel free to try it.
    – Andy E
    Commented Apr 25, 2013 at 7:44
  • 2
    @DeepakGoyal - The problem to which you refer is related to handling very large numbers in JavaScript. I suspect you'd have to get a library that uses bit manipulation and arrays to handle values larger than JavaScript's largest number. Of course, the other choice is not to do this in JavaScript but instead pass the value to a server side component where you use a language or library that can handle very large values.
    – Thomas
    Commented May 29, 2015 at 15:05
19

//How about byte-ing it?

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

I always feel kind of bad for bit operators in javascript-

they hardly get any exercise.

2
  • 14
    That fails for integers larger than 2^31 - 1, because >> converts the value to a signed 32-bit integer. Commented Feb 21, 2010 at 7:06
  • 1
    @kennebec awesome--that's by far the most amusing solution. And it is a heck of a lot better than a RegEx. Commented Oct 24, 2011 at 15:44
15

Number.isInteger() is probably the most concise. It returns true if it is an integer, and false if it isn't.

4
  • 1
    This should be the accepted answer, because it is better then using modulus due to the string issues.
    – Ini
    Commented Sep 6, 2018 at 0:02
  • 1
    modulus operator is smart mathematically, this is smart programaticaly, it's always simpler to use a function that already exists (specially if it's in the std) Commented Oct 24, 2020 at 5:03
  • IE doesn't support this. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    – Howdy
    Commented Sep 21, 2021 at 3:33
  • 1
    IE doesn't support a lot of things though/j Commented Oct 10, 2021 at 3:06
7
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Pretty cool and works for things like XX.0 too! It works because Math.floor() chops off any decimal if it has one so if the floor is different from the original number we know it is a decimal! And no string conversions :)

0
5

convert number string to array, split by decimal point. Then, if the array has only one value, that means no decimal in string.

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

This way you can also know what the integer and decimal actually are. a more advanced example would be.

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

if(!dece){
    //do stuff
}
4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);
3
  • 4
    Fails for num= 999999999999999999999.
    – bobince
    Commented Feb 21, 2010 at 0:14
  • 1
    convert to string first and then do the re.
    – ghostdog74
    Commented Feb 21, 2010 at 0:34
  • Worked for me without converting to string. Commented Sep 2, 2011 at 8:57
4
parseInt(num) === num

when passed a number, parseInt() just returns the number as int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true
1
  • 6
    I like this one a lot, but depends on one's specific needs. Unfortunately, I need a function to FAIL the test parseInt(3.0) === 3.0 // true
    – zipzit
    Commented Feb 2, 2015 at 23:24
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;
}
2
  • Doesn't need an explanation. It's pretty simple. Commented Aug 22, 2014 at 20:44
  • 1
    If the string contains any of the values in strCheck, it's a decimal... (he is missing out on . and , though...
    – NicoJuicy
    Commented Feb 6, 2015 at 14:46
2

You can multiply it by 10 and then do a "modulo" operation/divison with 10, and check if result of that two operations is zero. Result of that two operations will give you first digit after the decimal point. If result is equal to zero then the number is a whole number.

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

Use following if value is string (e.g. from <input):

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

I add .toString() to floor to make it work also for cases when value == "1." (ends with decimal separator or another string). Also Math.floor always returns some value so .toString() never fails.

1

Here's an excerpt from my guard library (inspired by Effective JavaScript by 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
1
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}
1

You can use the bitwise operations that do not change the value (^ 0 or ~~) to discard the decimal part, which can be used for rounding. After rounding the number, it is compared to the original value:

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 isWholeNumber(num) {
  return num === Math.round(num);
}
1

When using counters with decimal steps, checking if number is round will actually fail, as shown below. So it might be safest (although slow) to format the number with 9 (could be more) decimal places, and if it ends with 9 zeros, then it's a whole number.

const isRound = number => number.toFixed(9).endsWith('000000000');

for (let counter = 0; counter < 2; counter += 0.1) {
  console.log({ counter, modulo: counter % 1, formatted: counter.toFixed(9), isRound: isRound(counter) });
}

0

Perhaps this works for you?

It uses regex to check if there is a comma in the number, and if there is not, then it will add the comma and stripe.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);
3
  • Welcome to StackOverflow. Could you elaborate what this code does and why you think it will solve the problem.
    – quinz
    Commented Jun 6, 2019 at 11:26
  • @quinz It uses regex to check if there is a comma in the number, and if there is not then it will add the comma and stripe. So it does what the question is asking for with the added functionality of adding the formatting for rounded price tags. Commented Jul 4, 2019 at 11:04
  • jesus, regex is everywhere, I wanna kill myself, why did I become a developer. Commented Oct 24, 2020 at 5:00
0

You can use this:

bool IsInteger() {
    if (num.indexOf(".") != -1) // a decimal
    {
        return Math.ceil(num) == Math.floor(num); // passes for 1.0 as integer if thats the intent.
    }
    return Number.isSafeInteger(num);
}

to check if the number is integer or decimal.

0

Using Number.isInteger(num) can help check what would count as whole number and what would not.

For example:

let num1 = 6.0000000000000001; // 16 decimal places
let num2 = 6.000000000000001; // 15 decimal places

Number.isInteger(num1); // true, because of loss of precision

// while:
Number.isInteger(num2); // false

So, in my opinion it's safe to use Number.isInteger() over other suggested ways if what you need is to know what is an integer mathematically.

-1

Function for check number is Decimal or whole number

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.