如何检查一个数字是浮点数还是整数?

859

如何判断一个数字是float还是integer

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

53
我理解您的问题,但是为了明确:<nit-pick> JavaScript没有不同的整数和浮点数字类型。在JavaScript中每个数字都只是一个Number</nit-pick> - Matt Ball
5
根据您的理解,“无穷大”是整数还是非整数?这里的答案在这个问题上分布得相当均匀。 - Mike Samuel
14
为了数学上的准确性:由于无限大不是实数,而所有整数都是实数,因此“无穷大”不能被视为整数。 - rvighne
2
@rvighne,我认为我们都同意无穷大和NaN不是实数的事实意味着IEEE-754浮点数不是实数的子集。所有基于IEEE-754的数值分析都必须处理这个事实。我不明白的是你如何认为这个事实决定了is_integral在基数方面应该如何行事。就个人而言,我认为((x%1)==0)是一个很好的代理,并且已经被IEEE-754完全指定,因此没有必要争论不同数字线之间的对应关系。 - Mike Samuel
5
你认为 1.0 是整型还是浮点型? - vol7ron
显示剩余7条评论
52个回答

1493

当除以1时检查余数:

function isInt(n) {
   return n % 1 === 0;
}

如果您不知道参数是一个数字,则需要进行两个测试:

function isInt(n){
    return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}

2019年更新 这个答案编写后5年,ECMA Script 2015中已经标准化了一个解决方案。该解决方案在此答案中介绍。


148
注意,这也会返回一个空字符串、表示整数的字符串、truefalsenull、空数组、一个包含单个整数的数组、以及包含表示整数字符串的数组等内容的真值。 - Dagg Nabbit
22
很巧妙的方法,但不是正确答案,因为它未检查空字符串""1.0isInt("");isInt(1.0);都会得出true的结果,请参见此演示http://jsbin.com/elohuq/1/edit - GajendraSinghParihar
9
通常情况下,建议使用“===”而不是“==”,因为这样可以提高类型安全性,并且能够产生更加可预测和统一的行为。正如之前回答者所述,这个答案是完全错误的,null值、空字符串、1.0等许多其他值即使在使用“===”检查时也会被错误地识别为整数。 - whoblitz
65
问题是如何检查一个数字是否为整数,而不是如何检查任何值。 - kennebec
32
有很多关于它不验证字符串的敌对评论。这不是楼主的问题之一。如果我去SO上问一个关于获取数组最后一个元素的问题,有人回答说function last (array) { return array[array.length - 1]; },那么这个答案是否“完全错误”或者是“SO上最差的答案”,因为它没有先检查参数是否为数组?是的,检查参数是一个好习惯,但这应该是开发者的责任。SO的答案应该简短并且直接回答问题,尽可能清晰明了。 - M Miller
显示剩余17条评论

168

有一种方法叫做Number.isInteger(),目前在除IE外的所有浏览器中都已实现。MDN也为其他浏览器提供了一个polyfill:

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

然而,在大多数情况下,最好使用Number.isSafeInteger,它还会检查值是否过高/过低以至于任何小数位都将被丢失。 MDN也提供了相应的polyfil。(你还需要上面提到的isInteger polyfill。)

if (!Number.MAX_SAFE_INTEGER) {
    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};

1
在我看来,这是最好的解决方案。 - Automatico
9
Number.isInteger(12.0) //true (Chrome, Feb '17)可以翻译为:判断一个数是否为整数Number.isInteger(12.0) //true` (在 Chrome,2017年2月)返回结果为真。 - S Panfilov
1
这个带有polyfill的解决方案是最可靠和简单的。 - Francesco Pasa
8
@SergeyPanfilov 12.0 ∈ ℤ. - Константин Ван
2
我不知道自从这个答案被提供以来规范是否已经改变,但请注意上面的函数不是 Number.isInteger 的正确填充。然而,它是 Number.isSafeInteger 的正确填充。Number.isInteger 不应该检查数字是否为“安全整数”。请参见 MDN:isIntegerisSafeInteger - nunocastromartins
显示剩余2条评论

167

试用这些函数来测试一个值是否为数字原始值,且没有小数部分,并且在可表示为精确整数的大小限制之内。

function isFloat(n) {
    return n === +n && n !== (n|0);
}

function isInteger(n) {
    return n === +n && n === (n|0);
}

6
很棒的漏洞利用,基本就是我的(使用n===+n来检查数字,使用n|0来四舍五入),但内置操作符也很奇特。 - Claudiu
7
@John Hartsock,“string”永远不会是一个数值。它是一个字符串。该函数的目的是测试一个值是否为Javascript数值,其没有小数部分,并且在可以表示为精确整数的大小限制内。如果您想检查一个字符串是否包含代表数字的字符序列,则需要首先调用parseFloat()函数。 - Pointy
4
@Pointy的意思是,双精度浮点数可以精确表示整数值,最高可达2^53。所以这取决于OP是在数学意义上(整数)还是在32位数据意义上询问。如果是后者,你的解决方案就是完美的。 - djd
4
@Dan,Claudiu是正确的,“===+”只是我的懒惰格式。现在已经修复了,并添加了Pointy的出色评论。此外,w3schools通常被认为是不准确和不完整的;你可能不想将其用作参考。最好坚持使用来自MDN、WHATWG、W3C和官方规范的文档。 - Dagg Nabbit
8
在JavaScript中,位运算符(比如|或“或”)只能用于带符号的32位整数。但是,本文没有说明目标是否是要检查带符号的int32值。因此,这种方法不能用于超出范围的数字。例如 isInteger(5000000000) 将返回 false,这是错误的! - Onur Yıldırım
显示剩余15条评论

94

为什么不使用这样的代码:

var isInt = function(n) { return parseInt(n) === n };

4
这个方案似乎比帖子中的其他方案都要好得多。社区能否提供一些批评意见呢? - Stas Bichenko
7
var y = 1.00; y === parseInt(y, 10); // 这对我来说返回true,这并不是我们想要的。 - whoughton
我唯一看到的“缺点”是给定的数字 n 通过 parseInt 转换为字符串。请参阅 MDN。但我会使用这个解决方案。 :) - RhinoDevel
4
为什么会返回 false 呢?1 是整数,而且第二个参数 02 是被忽略的。 - Jonathan Hall
1
-1 是因为将数字转换为字符串,然后再将其解析回数字只是为了检查是否产生相同的值,这种复杂度显然是荒谬的。而实际上所需的只是检查一个已经以浮点形式存在的数字是否是整数。 - wchargin
显示剩余7条评论

32

你可以使用一个简单的正则表达式:

function isInt(value) {

    var er = /^-?[0-9]+$/;

    return er.test(value);
}

或者您也可以根据自己的需要使用以下函数,它们是由PHPJS项目开发的。

is_int() => 检查变量类型是否为整数并且其内容是否为整数

is_float() => 检查变量类型是否为浮点型并且其内容是否为浮点型

ctype_digit() => 检查变量类型是否为字符串并且其内容是否仅包含十进制数字

更新1

现在它也可以检查负数了,感谢@ChrisBartley的评论


1
非常适合测试简单的无符号整数。 - tothemario
7
一句话概括:/^[0-9]+$/.test(String(value))的意思是检查一个值是否为纯数字。 - tothemario
3
不能处理负整数。既然test()返回一个布尔值,因此不需要三元运算符。这个应该可以:return /^-?\d+$/.test(String(value)); - Chris Bartley
@ChrisBartley,谢谢!我进行了更新,包括您的署名。请检查一下现在是否一切都没问题。 - Marcio Mazzucato
正则表达式始终比其他方法慢。 - Krishnadas PC
显示剩余3条评论

20
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }

// give it a spin

isInteger(1.0);        // true
isFloat(1.0);          // false
isFloat(1.2);          // true
isInteger(1.2);        // false
isFloat(1);            // false
isInteger(1);          // true    
isFloat(2e+2);         // false
isInteger(2e+2);       // true
isFloat('1');          // false
isInteger('1');        // false
isFloat(NaN);          // false
isInteger(NaN);        // false
isFloat(null);         // false
isInteger(null);       // false
isFloat(undefined);    // false
isInteger(undefined);  // false

4
在JavaScript中,以 .0 结尾的小数会自动转换为整数类型。 - user234932
失败代码为 1.2。始终使用 0.1、0.2 和 0.3 测试数字函数。 - Lukas Liesis
@LukasLiesis 不是针对我。 - doubleOrt
这里不需要任何严格相等运算符。 - doubleOrt
isFloat(1563457121531) 返回 false。 - Aalex Gabi

19

以下是高效的函数,用于检查一个值是否为数字或者能够安全转换为数字:

function isNumber(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    if (typeof value == 'number') {
        return true;
    }
    return !isNaN(value - 0);
}

对于整数(如果值为浮点数则返回 false):

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}

这里的效率在于当值已经是数字时,避免了使用parseInt(或parseNumber)。两个解析函数总是先将其转换为字符串,然后再尝试解析该字符串,如果该值已经是数字,则会浪费时间。

感谢其他帖子在此提供了进一步的优化思路!


3
这个函数在空字符串上会失败:isNumber('') 的返回值为true。 - Jason Grout

12
function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

适用于所有情况。


3
这很好。 isInt('1') 返回预期的 true(至少对我来说是如此)。但是足够奇怪的是,isInt([5]) 也返回 true。这对我来说无关紧要,但对你可能有影响,所以请注意。 - acdcjunior
2
isFloat(12.0) 是 false。 - django

11

2022更新 - 我们可以简单地使用Number的方法。

检查整数或浮点数:

Number.isFinite(val)

检查整数:

Number.isInteger(val)

检查浮点数(非整数):

!Number.isInteger(val) && Number.isFinite(val)

8
这个怎么样?
isFloat(num) {
    return typeof num === "number" && !Number.isInteger(num);
}

尝试运行 console.log(isFloat(1.0)); 结果为 false。 - fabpico
isFloat(NaN)isFloat(Infinity) 返回 true :/ - piecioshka

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