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

cou*_*011 690 javascript types numbers

如何找到一个数字是floatinteger

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float
Run Code Online (Sandbox Code Playgroud)

ken*_*bec 1205

除以1时检查余数:

function isInt(n) {
   return n % 1 === 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 小心,对于空字符串,表示整数的字符串,`true`,`false`,`null`,空数组,包含单个整数的数组,包含表示字符串的字符串的数组,这也将返回true整数,也许更多. (138认同)
  • 问题是如何检查数字是否为整数,而不是如何检查任何值. (53认同)
  • 关于它如何不验证字符串的许多敌意评论.这不是OP问题的一部分.如果我去SO询问一个关于检索数组的最后一个元素的问题,有人用`function last(array){return array [array.length - 1]回答; 它是"只是错误"还是"最糟糕的答案",因为它不会先检查参数是否为数组?是的,检查参数的良好做法,但这是开发人员的责任.答案应该简短,并尽可能清楚地直接回答问题. (22认同)
  • 好的技巧,但不是正确的答案,因为它无法检查空字符串`""`和`1.0``isInt("");`&&`isInt(1.0);`两者都导致`true`看到这个演示http:/ /jsbin.com/elohuq/1/edit (15认同)
  • Ina,一般来说,===的使用超过==,因为它会带来更多的类型安全性和更可预测的统一行为.正如之前的回答者所说,这个答案绝对是100%不正确的.值null,空字符串,1.0和许多其他值都将错误地注册为整数(即​​使使用===检查). (9认同)
  • 需要注意的是,这种方法在大多数情况下都可以使用,但不足以假设converse(!isInt)意味着浮点数.尝试使用非常大的数字 - !isInt(Number.MAX_VALUE-0.1) - 它不起作用.这是由于使用了模数.以下答案中的方法*将适用于所有情况. (4认同)
  • 这是383竖起大拇指的公认答案,但这是错的.我的意思是,这就像一个解决方法,不会带你去你想去的地方.这是一种反模式. (3认同)
  • SO上最差的回答?`null%1 === 0`,`[]%1 === 0` (3认同)
  • 你还会使用它还是去寻找新的Number.isInteger()? (2认同)

Dag*_*bit 146

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

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

function isInteger(n) {
    return n === +n && n === (n|0);
}
Run Code Online (Sandbox Code Playgroud)

  • 在javascript中,像`|`(OR)这样的按位运算符只能在带符号的32位整数上运行.如果目标是检查签名的int32值,OP不会说明.所以这不适用于超出范围的数字.`isInteger(5000000000)`将返回`false`,这是错误的! (8认同)
  • @John Hartsock字符串永远不会是一个数值.这是一个字符串.此函数的要点是测试值是否为没有小数部分的Javascript数值,并且在可以表示为精确整数的大小限制内.如果要检查字符串以查看它是否包含表示数字的字符序列,则首先调用`parseFloat()`. (7认同)
  • heh awesom exploit,它几乎是我的(`n === + n`来检查数字,'n | 0`来回合),但内置运算符.时髦 (5认同)
  • @John Hartsock:除非传递一个数字原语,否则它不会返回true.我认为考虑到函数的名称,这是有道理的.如果正在编写这样的函数,那么其他任何东西都应该是isString,isBoolean等的候选者. (4认同)
  • @Pointy:双精度浮点数可以表示最多为2 ^ 53的整数值.因此,这取决于OP是在数学意义上(整数)还是在32位数据意义上询问整数.如果是后者,那么您的解决方案就是完美的. (4认同)
  • @Dan,Claudiu是对的,`=== +`只是我的懒惰格式.它现在已经修复,Pointy的优秀评论也加入了.此外,w3schools通常被认为是不准确和不完整的; 你可能不想用它作为参考.最好坚持MDN,WHATWG,W3C和官方规范的文档. (4认同)
  • +1使用`n | 0`将值转换为带符号的32位整数.正如@Dave所说,2 ^ 31和2 ^ 53之间的整数在JavaScript中很有意思,因为它们可以被精确地表示,但是被按位运算符截断到它们最不重要的32位. (2认同)

小智 91

为什么不是这样的:

var isInt = function(n) { return parseInt(n) === n };
Run Code Online (Sandbox Code Playgroud)

  • @whoughton 1.00 === 1.此解决方案是正确的. (7认同)
  • 这似乎是一个比这个线程中的其他人更好的解决方案.社区可能会提出一些批评吗? (4认同)
  • var y = 1.00; y === parseInt(y,10); //这对我来说是真的,这不是我们想要的. (4认同)
  • @ekussberg:为什么要返回false?1是一个整数。第二个参数02被忽略。 (2认同)
  • -1 因为将数字转换为字符串,然后将其解析回数字只是为了检查是否会产生相同的值,这是一种荒谬的复杂性,而真正需要的只是检查一个数字是否已经是浮点型form!——是一个整数。 (2认同)

pap*_*et7 69

有一种方法Number.isInteger(),目前只在最新的Firefox中实现,仍然是EcmaScript 6提案的一部分.但是,MDN为其他浏览器提供了一个polyfill,它匹配ECMA和声中指定的那个:

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

  • `Number.isInteger(12.0) //true`(Chrome,2017 年 2 月) (3认同)
  • @SergeyPanfilov`12.0∈ℤ`。 (2认同)
  • 我不知道自提供此答案以来规范是否已更改,但请注意,上述函数不是“Number.isInteger”的正确填充函数。然而,它是“Number.isSafeInteger”的正确填充。`Number.isInteger` 不应该检查数字是否是“安全整数”。请参阅 MDN:[isInteger](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger#Polyfill) 和 [isSafeInteger](https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger#Polyfill)。 (2认同)

Mar*_*ato 32

您可以使用简单的正则表达式:

function isInt(value) {

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

    return er.test(value);
}
Run Code Online (Sandbox Code Playgroud)

或者您也可以根据需要使用以下功能.它们由PHPJS项目开发.

is_int() =>检查变量类型是否为整数,以及其内容是否为整数

is_float() =>检查变量类型是否为float,以及其内容是否为float

ctype_digit() =>检查变量类型是否为字符串,以及其内容是否只有十进制数字

更新1

现在它也检查负数,感谢@ChrisBartley评论!

  • 一个班轮:`/ ^ [0-9] + $/.test(String(value))` (7认同)
  • 不处理负整数.您不需要三元运算符,因为test()返回一个布尔值.这应该这样做:`return/^ - ?\ d + $/.test(String(value));` (3认同)

Tal*_*ron 18

以下是检查值是数字还是可以安全地转换为数字的高效函数:

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

对于整数(如果值为float,则返回false):

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}
Run Code Online (Sandbox Code Playgroud)

这里的效率是当值已经是数字时避免使用parseInt(或parseNumber).两个解析函数总是首先转换为字符串,然后尝试解析该字符串,如果值已经是数字,这将是一种浪费.

感谢此处的其他帖子提供进一步的优化建议!

  • 此函数在空字符串上失败:isNumber('')为true. (3认同)

小智 13

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

检查是整数还是浮点: Number.isFinite(val)

检查是否为整数: Number.isInteger(val)

检查是否为浮点数(非整数):!Number.isInteger(val) && Number.isFinite(val)


shi*_*ime 12

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
Run Code Online (Sandbox Code Playgroud)

  • 1.0不是浮点数与isFloat所以不起作用 (3认同)
  • 显然,以.0结尾的浮点数会在JavaScript中自动转换为Int。 (3认同)

Dee*_*dav 9

function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}
Run Code Online (Sandbox Code Playgroud)

适用于所有情况.

  • +1这很好.`isInt('1')`按预期返回`true`(至少对我而言).但是很奇怪,这也会将`true`返回到`isInt([5])`.对我来说没关系,但可能对你而言,所以,要小心. (2认同)
  • isFloat(12.0)是假的 (2认同)

aks*_*ade 8

我们可以通过isInteger功能来检查。即 number 将返回 true,float 返回 false

console.log(Number.isInteger(2)),<BR>
Run Code Online (Sandbox Code Playgroud)

将返回true

console.log(Number.isInteger(2.5))
Run Code Online (Sandbox Code Playgroud)

会返回 false


Goe*_*rid 7

这个怎么样?

isFloat(num) {
    return typeof num === "number" && !Number.isInteger(num);
}
Run Code Online (Sandbox Code Playgroud)


Cla*_*diu 6

正如其他人提到的,你只有JS中的双打.那么如何定义一个整数?只需检查舍入数字是否等于它自己:

function isInteger(f) {
    return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }
Run Code Online (Sandbox Code Playgroud)

  • 可能想检查值是否为数字...`isFloat('abc')`返回`true` (3认同)

dke*_*ner 6

简单整数测试:

if( n === parseInt(n) ) ...
Run Code Online (Sandbox Code Playgroud)

这是有道理的:如果 JavaScript 可以将某些东西转换为整数,并且通过转换它变成完全相同的东西,那么你的操作数就是一个整数。

控制台测试用例:

x = 1;     x===parseInt(x); // true
x = "1";   x===parseInt(x); // false
x = 1.1;   x===parseInt(x); // false, obviously

// BUT!

x = 1.0;   x===parseInt(x); // true, because 1.0 is NOT a float!
Run Code Online (Sandbox Code Playgroud)

这让很多人感到困惑。每当某个东西是 .0 时,它就不再是浮点数了。它是一个整数。或者你可以称它为“数字事物”,因为没有像当时的 C 语言那样的严格区别。美好的旧时代。

所以基本上,您所能做的就是检查整数,接受 1.000 是整数这一事实。

有趣的旁注

有一个关于巨大数字的评论。巨大的数字意味着这种方法没有问题;每当 parseInt 无法处理该数字(因为它太大)时,它将返回实际值以外的其他内容,因此测试将返回 FALSE。看:

var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!

var aIsInteger = (  a===parseInt(a)  )?"a is ok":"a fails";
var bIsInteger = (  b===parseInt(b)  )?"b is ok":"b fails";

alert(aIsInteger+"; "+bIsInteger);
Run Code Online (Sandbox Code Playgroud)

我于 2014 年在 IE8 上进行了测试,然后在 2021 年在 Chrome 上进行了测试,两者都返回“a 正常;b 失败”,这意味着如果数字太大,它就不能再是整数了。

引用一句经典的话,20 位数字对任何人来说都应该足够了。


小智 5

任何具有零小数部分的浮点数(例如1.0,12.00,0.0)都会隐式转换为Integer,因此无法检查它们是否为Float.


Arm*_*ian 5

这是我用于整数的内容:

Math.ceil(parseFloat(val)) === val
Run Code Online (Sandbox Code Playgroud)

简短,好看:)一直都在工作.如果我没有弄错的话,这就是大卫弗拉纳根所暗示的.


Вик*_*лов 5

!!(24%1) // false
!!(24.2%1) // true
Run Code Online (Sandbox Code Playgroud)


ank*_*nkr 5

var isInt = function (n) { return n === (n | 0); };
Run Code Online (Sandbox Code Playgroud)

还没有发生过这不起作用的情况。

  • 因为这超过了 MaxInt。 (4认同)

Ale*_*dez 5

尝试了这里的一些答案,我最终编写了这个解决方案。这也适用于字符串内的数字。

function isInt(number) {
    if (!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return !(number - parseInt(number));
}

function isFloat(number) {
    if (!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return number - parseInt(number) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)

function isInt(number) {
    if (!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return !(number - parseInt(number));
}

function isFloat(number) {
    if (!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return number - parseInt(number) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)