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

480

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

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

1218

可以使用 模运算 来解决:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5
请注意,这是基于数字的而不是格式。它将包含具有固定小数点的整数的数字字符串视为整数:
'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

16
我没有点踩,但我觉得它与20.0有关,因为它仍然有小数点并且符合上述条件。无论如何,我还是要给你点赞,因为你教会了我一些新东西 :) - Abe Petrillo
7
@Abe: 这话说得没错,但我觉得这种情况不太可能。要在程序中确定20.0是否有小数点,除非它被表示为字符串。此外,其他解决方案都没有因未解决这个问题而受到贬低 ;-) 我的翻译如下:@Abe说的话确实没错,但我认为这种情况不太可能发生。如果要在程序中自动判断一个数字是否含有小数点,除非以字符串的形式表示,否则是不可能的。此外,其他解决方案并没有因为未解决这个问题而受到批评。;-) - Andy E
1
@SREEP:请参考上面的注释。在 JavaScript 中,0.00 作为数值表示时,并不等同于 0.00。它可以被表示为字符串("0.00"),这种情况下问题应该是“检查一个字符串是否是整数”,而不是“检查一个数是否是整数”。 - Andy E
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.”你的意思是什么?哪些内容将无效? "10." 是一个整数,结果与 "10"10 完全相同。 - Andy E
5
OP询问如何检查一个“数字”是否为整数。他没有提到“字符串”-在这方面,Andy的答案是正确的。 - Om Shankar
显示剩余14条评论

153
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 
Number.isInteger() 是 ES6 标准的一部分,不支持 IE11。它会针对非数字参数、NaNInfinity 返回 false,而 x % 1 != 0 则返回 true。

10
解决方案在12.0版本中失败。 - Vikas Arora
3
不,它的功能正常。Number.isInteger(12.0) 返回 true - le_m
这似乎应该是正确的答案,但不幸的是,对于科学计数法它不起作用,例如Number.isInteger('1e3')false,即使Number.isInteger(1e3)是true。 假设问题的意图是找到非整数值(而不是表示中实际存在小数点),那么字符串值'12.0' 应该 通过,因为它代表一个整数,但同样,Number.isInteger('12.0')false - brianmearns
1
@brianmearns OP的问题是一个“数字”是否为整数。如果您的输入是字符串,则需要首先将其转换为“数字”,例如通过“parseFloat()”。 - le_m
2
如果小数位数太多,这段代码将无法工作: Number.isInteger(2.000000000000000000001) // true - dYale
6
这是因为在 JavaScript 中 2.000000000000000000001 === 2 - le_m

73

或者你可以用这个来判断它是否不是十进制:

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

3
我认为这个是实际的解决方案,因为它甚至适用于XX.0。 - Deepankar Sarkar
12
在继续之前将其转换为字符串。例如:yournumber.toString.indexOf(".") - Daniel Omine
1
francisco_ssb.. 点号符号是通用的... 在数学语言中代表小数点... 这是通用的,应该在任何国家都可以使用。 如果您谈论逗号(“,”),则必须在 indexOf(".") 之前转换为点号("."), 显然... - Daniel Omine
3
如果小数为1.00且您希望将其转换为整数,则如果不强制转换该值,此方法将无效。 - simon-p-r
1
@simon-p-r,为什么不能用1.00?1.00有小数点并且符合条件,完全可以使用啊,我有什么遗漏吗? - ncubica
显示剩余6条评论

35

简单而有效!

Math.floor(number) === number;

6
@OmShankar 高效并不等于高效果。 - Fiddles
5
Math.floor(3.0) == 3.0 的结果为真,Math.floor(3.3) == 3.3 的结果为假。 - tim-phillips
@Fiddles,噢,对了,这就是我想说的:与%mod方法相比,这种方法效率不高,性能要慢得多。谢谢指正。 - Om Shankar

25
Number.isSafeInteger(value);

在JavaScript中,isSafeInteger()是一个Number方法,用于返回一个布尔值,指示一个值是否为安全整数。这意味着它是一个整数值,可以精确地表示为IEEE-754双精度数字,而不需要四舍五入。


24

最常见的解决方案是去除数字的整数部分,并将其与零进行比较,如下所示:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

38
为什么不直接使用startVal != Math.floor(startVal) - Andy E
4
好的,同样的概念,但你的版本更简洁。 - Thomas
3
@SeeyaK:当然可以用于负数。请随意尝试。 - Andy E
1
@Thomas,这个问题有什么解决方案吗? - Deepak Goyal
2
@DeepakGoyal - 你所提到的问题与在JavaScript中处理非常大的数字有关。我怀疑你需要获取一个使用位操作和数组来处理比JavaScript最大数字更大的值的库。当然,另一种选择是不要在JavaScript中进行此操作,而是将该值传递给服务器端组件,在那里您可以使用能够处理非常大值的语言或库。 - Thomas
显示剩余6条评论

19

//把它转换为字节呢?

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

我总觉得在JavaScript中位运算符有点冤枉——

它们几乎没有什么用武之地。


14
针对大于 2^31-1 的整数,这种方法会失败,因为 >> 操作符会将值转换成有符号的 32 位整数 - Matthew Crumley
1
@kennebec 真棒——这绝对是最有趣的解决方案。而且比正则表达式要好得多。 - Daniel B. Chapman

14

Number.isInteger() 可能是最简洁的方法。它返回 true 如果是整数,返回 false 如果不是。


1
这应该是被接受的答案,因为它比使用模数更好,由于字符串问题。 - Ini
1
模数运算符在数学上很聪明,在编程上也很聪明,如果已经存在一个函数(特别是在std中),那么使用现有的函数总是更简单的。 - Jaacko Torus
IE不支持此功能。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger - Howdy
1
IE虽然不支持很多东西。 - Mira Welner

7
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

很酷,适用于像XX.0这样的东西!它能够工作是因为Math.floor()会切掉任何小数,如果floor与原始数字不同,那么我们就知道它是一个小数!而且无需进行字符串转换 :)

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

4
num=999999999999999999999 失败了。 - bobince
1
先将其转换为字符串,然后执行 re 操作。 - ghostdog74
没有将其转换为字符串,它对我起作用了。 - Abe Petrillo

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