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

IT技术 javascript types numbers
2021-01-30 09:43:23

如何找到一个数字是floatinteger

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float
6个回答

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

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

Ina,通常鼓励使用 === 而非 ==,因为它会带来更多的类型安全性和更可预测的统一行为。正如之前的回答者所说,这个答案绝对是 100% 不正确的。值 null、空字符串、1.0 和许多其他值都将错误地注册为整数(即​​使使用 === 检查)。
2021-03-25 09:43:23
小心,对于空字符串、表示整数的字符串、truefalsenull、空数组、包含单个整数的数组、包含表示整数的字符串的数组等,这也将返回 true
2021-03-28 09:43:23
不错的技巧,但不是正确的答案,因为它无法检查空字符串""1.0 isInt("");&&isInt(1.0);都导致true看到这个演示jsbin.com/elohuq/1/edit
2021-04-05 09:43:23
问题是如何检查数字是否为整数,而不是如何检查任何值。
2021-04-06 09:43:23
许多关于它如何不验证字符串的敌意评论。这不是 OP 问题的一部分。如果我继续问一个关于检索数组最后一个元素的问题,有人用 回答function last (array) { return array[array.length - 1]; },它是“只是错误的”还是“SO 上的最差答案”,因为它不首先检查参数是否是数组?是的,检查参数的好习惯,但这是开发人员的责任。所以答案应该简短,并尽可能清楚地直接回答问题。
2021-04-07 09:43:23

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

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

function isInteger(n) {
    return n === +n && n === (n|0);
}
@John Hartsock 字符串永远不会是数值。这是一个字符串。这个函数的重点是测试一个值是否是一个没有小数部分的 Javascript 数值,并且在可以表示为一个精确整数的大小限制内。如果要检查字符串以查看它是否包含代表数字的字符序列,则应parseFloat()调用
2021-03-11 09:43:23
heh 很棒的漏洞利用,它几乎是我的(n===+n检查数字,n|0四舍五入),但带有内置运算符。时髦的
2021-03-16 09:43:23
在 javascript 中,像|(OR)这样的按位运算符只对有符号的 32 位整数进行操作。OP 没有说明目标是否是检查有符号的 int32 值。所以这不适用于超出范围的数字。isInteger(5000000000)将返回false这是错误的!
2021-03-20 09:43:23
@John Hartsock:除非传递了数字原语,否则它不会返回 true。考虑到函数的名称,我认为这是有道理的。如果正在编写此类函数,则其他任何内容都应该是 isString、isBoolean 等的候选对象。
2021-03-22 09:43:23
@Pointy:双精度浮点数可以精确地表示高达 2^53 的整数值。因此,这取决于 OP 是在数学意义上(整数)还是在 32 位数据意义上询问整数。如果是后者,则您的解决方案是完美的。
2021-03-31 09:43:23

有一个被调用的方法Number.isInteger(),它目前在除 IE 之外的所有东西中实现。MDN还为其他浏览器提供了 polyfill:

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

但是,对于大多数用例,最好使用Number.isSafeInteger which 还检查值是否太高/太低以至于任何小数位都会丢失。MDN也为此提供了一个 polyfil。(您还需要isInteger上面pollyfill。)

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;
};
这与 polyfill 是最可靠和最简单的解决方案。
2021-03-15 09:43:23
在我看来最好的解决方案。
2021-03-17 09:43:23
我不知道自提供此答案以来规范是否已更改,但请注意,上述功能不是Number.isInteger. 然而,它是一个正确的 polyfill Number.isSafeIntegerNumber.isInteger不应该检查数字是否是“安全整数”。请参阅 MDN:isIntegerisSafeInteger
2021-03-20 09:43:23
@谢尔盖潘菲洛夫12.0 ∈ ℤ
2021-04-01 09:43:23
Number.isInteger(12.0) //true (Chrome,2017 年 2 月)
2021-04-08 09:43:23

为什么不是这样的:

var isInt = function(n) { return parseInt(n) === n };
-1 因为将数字转换为字符串然后将其解析回数字只是为了检查结果是否相同是一种荒谬的复杂性,而真正需要的是检查数字是否已经是浮点数形式!—是一个整数。
2021-03-13 09:43:23
这似乎是比该线程中的其他解决方案要好得多的解决方案。也许社区可以提出一些批评?
2021-03-22 09:43:23
这对我来说实际上是一个好的解决方案的核心。我需要允许正整数并禁止浮点数、字符串和负整数。
2021-03-24 09:43:23
变量 y = 1.00; y === parseInt(y, 10); // 这对我来说返回 true,这不是我们真正想要的。
2021-03-30 09:43:23
@ekussberg:为什么要返回 false?1 是一个整数。02,第二个参数,被忽略。
2021-04-01 09:43:23

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

function isInt(value) {

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

    return er.test(value);
}

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

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

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

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

更新 1

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

@ChrisBartley,谢谢!我做了更新,包括你的学分。请检查现在是否一切正常。
2021-03-12 09:43:23
更短且可读性稍差的单行: /^[0-9]+$/.test(''+value)
2021-03-18 09:43:23
一个班轮: /^[0-9]+$/.test(String(value))
2021-03-24 09:43:23
非常适合测试简单的无符号整数。
2021-03-27 09:43:23
不处理负整数。您也不需要三元运算符,因为 test() 返回一个布尔值。这应该这样做:return /^-?\d+$/.test(String(value));
2021-04-05 09:43:23