Björn
Björn

Reputation: 13207

Check if a number has a decimal place/is a whole number

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) {...}

Upvotes: 500

Views: 720782

Answers (24)

Abdulsalam
Abdulsalam

Reputation: 293

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.

Upvotes: 1

Gauravsa
Gauravsa

Reputation: 6524

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.

Upvotes: 0

aaditya
aaditya

Reputation: 773

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.

Upvotes: 32

domaci_a_nas
domaci_a_nas

Reputation: 268

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) });
}

Upvotes: 1

michal.jakubeczy
michal.jakubeczy

Reputation: 9469

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.

Upvotes: 2

Ike
Ike

Reputation: 783

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

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

Upvotes: 74

dYale
dYale

Reputation: 1661

Simple, but effective!

Math.floor(number) === number;

Upvotes: 37

user11608734
user11608734

Reputation: 1

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);

Upvotes: 0

Dmitry Shashurov
Dmitry Shashurov

Reputation: 1714

function isWholeNumber(num) {
  return num === Math.round(num);
}

Upvotes: 1

Mira Welner
Mira Welner

Reputation: 439

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

Upvotes: 15

makovkastar
makovkastar

Reputation: 5020

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

Upvotes: 1

Andy E
Andy E

Reputation: 344575

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

Upvotes: 1245

Steve Brush
Steve Brush

Reputation: 3181

function isDecimal(num) {
  return (num !== parseInt(num, 10));
}

Upvotes: 1

user7873306
user7873306

Reputation:

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 :)

Upvotes: 7

BSevo
BSevo

Reputation: 793

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
}

Upvotes: 2

le_m
le_m

Reputation: 20228

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.

Upvotes: 165

Kareem
Kareem

Reputation: 5404

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
}

Upvotes: 5

user1124
user1124

Reputation: 9

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;
}

Upvotes: -1

schirrmacher
schirrmacher

Reputation: 2357

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

Upvotes: 1

Michael
Michael

Reputation: 22957

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

Upvotes: 4

Vitor Lins
Vitor Lins

Reputation: 31

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;
}

Upvotes: 3

kennebec
kennebec

Reputation: 104780

//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.

Upvotes: 19

ghostdog74
ghostdog74

Reputation: 342373

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

Upvotes: 4

Thomas
Thomas

Reputation: 64645

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 )
}

Upvotes: 24

Related Questions