检查数字是否有小数位/是否为整数

Check if a number has a decimal place/is a whole number

提问人:Björn 提问时间:2/21/2010 最后编辑:reformedBjörn 更新时间:2/19/2023 访问量:657181

问:

我在 JavaScript 中寻找一种简单的方法来检查数字中是否有小数位(以确定它是否是整数)。例如

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}
JavaScript 验证 整数

评论


答:

1219赞 Andy E 2/21/2010 #1

使用模数将起作用:

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赞 Abe Petrillo 9/2/2011
我没有投反对票,但我会说它与 20.0 有关,仍然有一个小数点并满足上述要求。无论如何,我+1教了我一些新的东西:)
7赞 Andy E 9/2/2011
@Abe:没错,不过我认为这不太可能。不可能以编程方式说出是否有小数点,除非它表示为字符串。此外,没有其他解决方案因不解决这个问题而投反对票;-)20.0
1赞 Andy E 8/16/2013
@SREEP:请参阅上面的评论。在 JavaScript 中,0.00 表示为数字值时不是 0.00。它可以表示为字符串(“0.00”),在这种情况下,问题是“检查字符串是否为整数”而不是“检查数字是否为整数”。
3赞 Andy E 12/6/2014
@Swanidhi:什么意思?什么无效? 是一个整数,结果将与 或 完全相同。"10.""10"10
5赞 Om Shankar 5/2/2016
OP 询问如何检查 NUMBER 是否为整数。他没有提到字符串——在这方面,安迪的回答是对的。
24赞 Thomas 2/21/2010 #2

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

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

评论

38赞 Andy E 2/21/2010
为什么不只是 ?startVal != Math.floor(startVal)
4赞 Thomas 2/21/2010
好。相同的概念,但您的版本更干净。
1赞 Seeya K 4/25/2013
@Andy E:这仅适用于正数。它不适用于负数。
3赞 Andy E 4/25/2013
@SeeyaK:当然,它适用于负数。请随时尝试。
2赞 Thomas 5/29/2015
@DeepakGoyal - 您提到的问题与在 JavaScript 中处理非常大的数字有关。我怀疑你必须得到一个使用位操作和数组来处理大于 JavaScript 最大数字的值的库。当然,另一种选择不是在 JavaScript 中执行此操作,而是将值传递给服务器端组件,在该组件中,您可以使用可以处理非常大值的语言或库。
4赞 ghostdog74 2/21/2010 #3
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

评论

4赞 bobince 2/21/2010
失败。num= 999999999999999999999
1赞 ghostdog74 2/21/2010
首先转换为字符串,然后执行 re。
0赞 Abe Petrillo 9/2/2011
在不转换为字符串的情况下为我工作。
19赞 kennebec 2/21/2010 #4

对它进行字节化怎么样?

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

我总是觉得 javascript 中的位运算符有点不好——

他们几乎得不到任何锻炼。

评论

14赞 Matthew Crumley 2/21/2010
对于大于 2^31 - 1 的整数,这将失败,因为会将值转换为有符号的 32 位整数>>
1赞 Daniel B. Chapman 10/24/2011
@kennebec太棒了——这是迄今为止最有趣的解决方案。它比正则表达式要好得多。
73赞 Ike 10/24/2011 #5

或者你可以用它来找出它是否不是小数:

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

评论

3赞 Deepankar Sarkar 12/20/2014
我认为这是实际的解决方案,因为这甚至适用于 XX.0
12赞 Daniel Omine 9/21/2015
在继续之前转换为字符串。结婚yournumber.toString.indexOf(".")
1赞 Daniel Omine 9/21/2015
francisco_ssb..点符号是通用的......表示数学语言中的小数位。.这是普遍的,在任何国家都应该有效。如果你谈论逗号 (“,”),你必须在 indexOf(“.”) 之前转换为点 (“.”),显然.
1赞 AuRise 4/13/2016
我认为,当他的意思是它在某些国家不起作用时,他指的是货币,因为欧元使用逗号而不是小数点。然而,这个问题并不特定于货币,只是小数点......就像数字的一小部分一样。
3赞 simon-p-r 6/15/2016
如果 decimal 为 1.00,并且您希望它为 int,除非您强制值,否则这不起作用
3赞 Vitor Lins 10/27/2012 #6
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;
}

评论

0赞 Grant Birchmeier 8/23/2014
不需要解释。这很简单。
1赞 NicoJuicy 2/6/2015
如果字符串包含 strCheck 中的任何值,则它是小数...(他错过了 . 而且,虽然......
3赞 Michael 1/22/2015 #7
parseInt(num) === num

当传递一个数字时,只需将数字返回为 int:parseInt()

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

评论

6赞 zipzit 2/3/2015
我非常喜欢这个,但取决于一个人的具体需求。不幸的是,我需要一个函数来使测试失败parseInt(3.0) === 3.0 // true
35赞 dYale 3/3/2015 #8

简单,但有效!

Math.floor(number) === number;

评论

6赞 Fiddles 7/5/2017
@OmShankar efficient != 有效
5赞 tim-phillips 1/14/2018
Math.floor(3.0) == 3.0是真的,是假的Math.floor(3.3) == 3.3
0赞 Om Shankar 7/30/2018
@Fiddles,哦,对了,这就是我想说的:效率不高,因为与% mod方法相比,这在性能上要慢得多。感谢您的纠正
1赞 schirrmacher 10/15/2015 #9

以下是我的 guard 库的摘录(灵感来自 David Herman 的 Effective JavaScript):

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赞 user1124 4/28/2016 #10

校验号码的函数是十进制或整数

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}
4赞 Kareem 7/3/2016 #11

将数字字符串转换为数组,按小数点拆分。然后,如果数组只有一个值,则表示字符串中没有小数。

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
}
153赞 le_m 3/15/2017 #12
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger() 是 ES6 标准的一部分,在 IE11 中不受支持。

它返回 的 false 和非数字参数,而返回 true。NaNInfinityx % 1 != 0

评论

10赞 Vikas Arora 5/21/2018
12.0 解决方案失败
3赞 le_m 5/22/2018
@VikasArora 不,它按预期工作。 返回。Number.isInteger(12.0)true
1赞 le_m 4/22/2019
@brianmearns OP的问题是a是否是整体。如果你的输入是一个字符串,你需要把它转换成一个第一个,例如,当然是via。numbernumberparseFloat()
2赞 dYale 3/23/2021
如果小数位过多,这将不起作用: // trueNumber.isInteger(2.000000000000000000001)
6赞 le_m 3/23/2021
@dYale这是因为在 JavaScript 中2.000000000000000000001 === 2
2赞 BSevo 4/5/2017 #13

您可以将其乘以 10,然后用 10 进行“”运算/除法,并检查这两个运算的结果是否为零。这两个操作的结果将为您提供小数点后的第一个数字。 如果 result 等于零,则该数字为整数。

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}
7赞 user7873306 6/6/2017 #14
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

很酷,也适用于 XX.0 之类的东西! 它之所以有效,是因为 Math.floor() 会砍掉任何小数点(如果它有一个小数点),所以如果下限与原始数字不同,我们知道它是小数点!并且没有字符串转换:)

1赞 Steve Brush 8/4/2017 #15
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}
1赞 makovkastar 2/24/2018 #16

您可以使用不更改值 ( 或 ) 的按位运算来放弃可用于舍入的小数部分。将数字四舍五入后,将其与原始值进行比较:^ 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
14赞 Mira Welner 9/4/2018 #17

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

评论

1赞 Ini 9/6/2018
这应该是公认的答案,因为由于字符串问题,它比使用模数更好。
1赞 Julian A Avar C 10/24/2020
模运算符在数学上是智能的,这在编程上是智能的,使用已经存在的函数总是更简单(特别是如果它在标准中)
0赞 Howdy 9/21/2021
IE 不支持此功能。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......
1赞 Mira Welner 10/10/2021
IE不支持很多东西/j
1赞 Dmitry Shashurov 4/1/2019 #18
function isWholeNumber(num) {
  return num === Math.round(num);
}
0赞 user11608734 6/6/2019 #19

也许这对你有用?

它使用正则表达式来检查数字中是否有逗号,如果没有,则将添加逗号和条纹。

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

评论

0赞 quinz 6/6/2019
欢迎来到 StackOverflow。您能否详细说明这段代码的作用以及您为什么认为它会解决问题。
0赞 user11608734 7/4/2019
@quinz 它使用正则表达式来检查数字中是否有逗号,如果没有,则将添加逗号和条纹。因此,它通过添加四舍五入价格标签格式的附加功能来满足问题的要求。
0赞 Julian A Avar C 10/24/2020
天哪,正则表达式无处不在,我想自杀,我为什么会成为一名开发人员。
2赞 michal.jakubeczy 3/26/2020 #20

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

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

我添加到地板以使其也适用于以下情况(以小数分隔符或其他字符串结尾)。也总是返回一些值,所以永远不会失败。.toString()value == "1."Math.floor.toString()

1赞 domaci_a_nas 6/8/2021 #21

使用带有小数步长的计数器时,检查数字是否为舍入实际上会失败,如下所示。因此,用 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) });
}

25赞 aaditya 8/10/2021 #22
Number.isSafeInteger(value);

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

0赞 Gauravsa 2/3/2023 #23

您可以使用以下功能:

bool IsInteger() {
    if (num.indexOf(".") != -1) // a decimal
    {
        return Math.ceil(num) == Math.floor(num); // passes for 1.0 as integer if thats the intent.
    }
    return Number.isSafeInteger(num);
}

以检查数字是整数还是小数。

0赞 Abdulsalam 2/19/2023 #24

使用可以帮助检查哪些算作整数,哪些不算作整数。Number.isInteger(num)

例如:

let num1 = 6.0000000000000001; // 16 decimal places
let num2 = 6.000000000000001; // 15 decimal places

Number.isInteger(num1); // true, because of loss of precision

// while:
Number.isInteger(num2); // false

因此,在我看来,如果您需要的是知道数学上什么是整数,那么使用其他建议的方式是安全的。Number.isInteger()