检查一个数字是否有小数位/是整数

480

我正在寻找一种在JavaScript中轻松检查数字是否有小数位(以确定它是否为整数)的方法。例如,

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

4
将数字字符串转换为数组,通过小数点进行分割。如果该数组只有一个值,则表示字符串中没有小数。
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
}

3
parseInt(num) === num

当传入一个数字时,parseInt() 会将其返回为整数:
parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

6
我很喜欢这个选项,但它取决于具体的需求。不幸的是,我需要一个能通过测试 parseInt(3.0) === 3.0 // true 的函数失败。 - zipzit

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

很简单,不需要解释。 - Grant Birchmeier
1
如果字符串包含strCheck中的任何值,则它是一个十进制数...(不过他漏掉了"."和",") - NicoJuicy

2

如果值是字符串(例如来自<input),请使用以下内容:

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

我在 floor 后面添加了 .toString(),以使其在 value == "1." (以小数分隔符或其他字符串结尾) 的情况下也能正常工作。另外,Math.floor 总是返回一个值,因此 .toString() 永远不会失败。


2
你可以将其乘以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

这是我从David Herman的《Effective JavaScript》中得到灵感后编写的guard库的摘录:

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

1
使用小数步长的计数器时,检查数字是否为整数实际上会失败,如下所示。因此,最安全的方法(尽管速度较慢)可能是将数字格式化为9(可以更多)个小数位数,并且如果以9个零结尾,则它是一个整数。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接