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


283

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

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

Answers:


818

使用模数将起作用:

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

10
我没有拒绝投票,但我想说它与20.0有关,但仍然有一个小数点并满足上述要求。无论如何,我还是从我那里+1来教给我一些新的东西:)
Abe Petrillo

7
@Abe:确实如此,尽管我认为这不太可能。20.0除非用字符串表示,否则无法以编程方式说出是否有小数点。此外,没有其他解决方案因不解决该问题而遭到否决;-)
Andy E

1
@SREEP:请参阅上面的评论。以数字值表示时,JavaScript中的0.00不是0.00。它可以表示为字符串(“ 0.00”),在这种情况下,问题是“检查字符串是否为整数”而不是“检查数字是否为整数”
Andy E

3
@Swanidhi:你是什么意思?什么是无效的?"10."是一个整数,结果将与"10"或完全相同10
安迪E

3
OP询问有关检查NUMBER是否为整数的问题。他无处提及弦乐 -在这方面,安迪的答案是正确的。
Om Shankar

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

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

对于NaN,它返回false ,Infinity而非数字参数则x % 1 != 0返回true。


2
12.0的解决方案失败
Vikas Arora

@VikasArora不,它按预期工作。Number.isInteger(12.0)返回true
le_m

看来这应该是正确的答案,但不幸的是,它对于科学表示法不起作用,例如Number.isInteger('1e3')is false,即使它Number.isInteger(1e3)是正确的。假设问题的目的是查找非整数值(而不是表示形式中实际存在小数点),则字符串值“ 12.0” 应该通过,因为它表示整数,但Number.isInteger('12.0')还是false
brianmearns

@brianmearns OP的问题是a number是否完整。如果您的输入是字符串,那么您当然需要将其转换为number第一个,例如,通过parseFloat()
le_m

47

或者,您可以使用它来确定它是否不是小数:

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

2
我认为这是一个实际的解决方案,因为即使在XX.0上也可以使用
Deepankar Sarkar

5
在继续之前转换为字符串。.即: yournumber.toString.indexOf(".")
Daniel Omine15年

1
francisco_ssb ..点符号是通用的...表示数学语言中的小数位。.这是通用的,并且可以在任何国家/地区使用。如果你说的是逗号(“‘),你必须(’。‘)在之前的indexOf转换点(’。”),很明显..
丹尼尔·大岭

1
我认为当他表示在某些国家/地区无法使用时,他指的是货币,因为欧元使用逗号而不是小数点。但是,问题不仅仅针对货币,还只是小数……只是一个小数。
泰莎

1
如果十进制为1.00,并且您不希望值强制为整数,则此方法将不起作用
simon-pr

21

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

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

31
为什么不只是startVal != Math.floor(startVal)呢?
安迪E

2
真好 相同的概念,但您的版本更干净。
托马斯

1
@Andy E:这仅适用于正数。它不会负数工作..
Seeyaķ

3
@SeeyaK:当然,它适用于负数。请随时尝试。
Andy E

1
@DeepakGoyal-是设计使然。该Math.Floor函数采用一个十进制值,JavaScript中允许的最大十进制值为2^53 - 19007199254740991。由于893144042145698745.3大于此最大值,因此该功能将失败。
汤玛斯(Thomas)

20

简单但有效!

Math.floor(number) === number;

4
@OmShankar高效!=有效
Fiddles '17

Math.floor(3.0) == 3.0Math.floor(3.3) == 3.3是假
罗门(Rohmer)

@Fiddles,哦,对了,这就是我想说的:效率不高,因为与%mod方法相比,它的性能要慢得多。感谢修正
嗡尚卡尔

19

//字节化怎么样?

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

我总是对javascript-中的位运算符感到不好

他们几乎没有运动。


14
对于大于2 ^ 31-1的整数,此操作将失败,因为>>它将值转换为带符号的32位整数
马修·克鲁姆利

1
@kennebec很棒-这是迄今为止最有趣的解决方案。它比RegEx好得多。
Daniel B. Chapman

5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

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



4

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


1
这应该是可接受的答案,因为由于字符串问题,使用模数会更好。
的Ini

3
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;
}

不需要解释。很简单
Grant Birchmeier 2014年

1
如果字符串包含strCheck中的任何值,则为十进制...(他在。和上丢失了,尽管...
NicoJuicy 2015年

2
parseInt(num) === num

传递数字时,parseInt()仅将数字返回为int:

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

4
我非常喜欢这个,但是要取决于一个人的特定需求。不幸的是,我需要一个使测试失败的函数parseInt(3.0) === 3.0 // true
zipzit 2015年

2

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

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
}

1

这是我的防护库的摘录(由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

你可以乘以10,然后做一个“ ”的操作/ divison 10,并检查是否有两个操作的结果是零。这两个操作的结果将为您提供小数点后的第一位数字。如果结果等于零,则该数字为整数。

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}


1

您可以使用不更改值(^ 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


1

您可以使用以下函数检查数字是否有小数位:

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

因此,显然一些用户想要解释。我将其分成几部分:(num%1)

括号表示先执行那些操作。num-函数传入的变量。%-模数符号,试图将左数除以右。如果有余数,则以小数形式返回。如果平均分配,则返回0。

因此,总结一下到目前为止,(num%1)将返回:

均分时为0,否则为#。#####

0 ==错误。

[ANY_NUMBER_NOT_ZERO] ==正确。

示例:new Boolean(0)是false new Boolean(12312.1231)是true

其他替代方案:用户可以尝试返回(num%1)。的值,这基本上可以实现相同的目的。由于return(0)为false,而return(1.213113)为true。

但是我想返回一个布尔值。因此,作为将值强制转换为布尔值的快捷方式,我添加了!前面的符号。

可能知道的很多。表示不。但这也将值强制为布尔值。

自!symobol将值强制为布尔值,然后反转其值。我用 !!强制将值转换为布尔值并将其值转换回其原始布尔值。

在此处输入图片说明


尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
Nic3500 '18

0

支票号码的功能是十进制或整数

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

0

也许这对您有用?

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

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

欢迎使用StackOverflow。您能否详细说明这段代码的作用以及您认为它可以解决问题的原因。
quinz

@quinz它使用正则表达式检查数字中是否有逗号,如果没有,则将添加逗号和条纹。因此,它通过添加为四舍五入的价格标签设置格式的附加功能,可以满足问题的要求。
user11608734 '19

0

如果值是字符串(例如,来自<input),请使用以下命令:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.