如何检查给定的值是正整数还是负整数?

比方说,我有值10分配给一个variables;

var values = 10; 

我想运行一个特定的function,如果该值是积极的

 if(values = +integer){ //do something with positive } else { //do something with negative values } 

这将如何实现?

 if (values > 0) { // Do Something } 

为了检查,这是最快的方式,看来:

 var sign = number > 0 ? 1 : number == 0 ? 0 : -1; //Is "number": greater than zero? Yes? Return 1 to "sign". //Otherwise, does "number" equal zero? Yes? Return 0 to "sign". //Otherwise, return -1 to "sign". 

它告诉你符号是正数(返回1)还是等于零(返回0)否则(返回-1) 。 这是一个很好的解决scheme,因为0不是正数,也不是负数,但它可能是你的variables。

失败的尝试:

 var sign = number > 0 ? 1 : -1; 

将0作为一个负整数 ,这是错误的。

如果您尝试设置条件,则可以相应地进行调整。 下面是if / else-if语句的两个类似的例子:

例1:

 number = prompt("Pick a number?"); if (number > 0){ alert("Oh baby, your number is so big!");} else if (number == 0){ alert("Hey, there's nothing there!");} else{ alert("Wow, that thing's so small it might be negative!");} 

例2:

 number = prompt("Pick a number?"); var sign = number > 0 ? 1 : number == 0 ? 0 : -1; if (sign == 1){ alert("Oh baby, your number is so big!" + " " + number);} else if (sign == 0){ alert("Hey, there's nothing there!" + " " + number);} else if (sign == -1){ alert("Wow, that thing's so small it might be negative!" + " " + number);} 

我是唯一一个读过这个的人,意识到没有一个答案能够解决问题的“整数”部分?

问题

 var myInteger = 6; var myFloat = 6.2; if( myInteger > 0 ) // Cool, we correctly identified this as a positive integer if( myFloat > 0 ) // Oh, no! That's not an integer! 

解决scheme

为了保证你正在处理一个整数,你想把你的值转换成一个整数,然后将其与自身进行比较。

 if( parseInt( myInteger ) == myInteger && myInteger > 0 ) // myInteger is an integer AND it's positive if( parseInt( myFloat ) == myFloat && myFloat > 0 ) // myFloat is NOT an integer, so parseInt(myFloat) != myFloat 

一些整洁的优化

作为奖励, 在JavaScript中有一些从float转换为整数的快捷方式 。 在JavaScript中,所有按位运算符( |^&等)将在操作之前将您的编号转换为整数。 我认为这是因为99%的开发人员不知道IEEE浮点标准,当“200 | 2”评估为400(ish)时,将会感到非常困惑。 这些快捷键往往比Math.floorparseInt 运行得更快 ,如果您尝试排除尽可能最小的代码,它们会占用更less的字节:

 if( myInteger | 0 == myInteger && myInteger > 0 ) // Woot! if( myFloat | 0 == myFloat && myFloat > 0 ) // Woot, again! 

但是等等,还有更多!

这些按位运算符正在处理32位有符号整数。 这意味着最高位是符号位。 通过强制符号位为零,您的号码将保持不变, 只有当它是正面的 。 你可以用它来检查正面性和整数在一个单一的打击:

 // Where 2147483647 = 01111111111111111111111111111111 in binary if( (myInteger & 2147483647) == myInteger ) // myInteger is BOTH positive and an integer if( (myFloat & 2147483647) == myFloat ) // Won't happen * note bit AND operation is wrapped with parenthesis to make it work in chrome (console) 

如果您难以记住这个复杂的数字,您也可以事先计算它:

 var specialNumber = ~(1 << 31); 

检查底片

Per @ Reinsbrain的评论,类似的按位破解可以用来检查一个整数。 在一个负数中,我们希望最左边的位是1,所以通过强制这个位为1,数字只会保持不变,如果它是负的开始:

 // Where -2147483648 = 10000000000000000000000000000000 in binary if( (myInteger | -2147483648) == myInteger ) // myInteger is BOTH negative and an integer if( (myFloat | -2147483648) == myFloat ) // Won't happen 

这个特殊的数字更容易计算:

 var specialNumber = 1 << 31; 

边缘情况

如前所述,由于JavaScript按位运算符转换为32位整数,因此不符合32位(大于20亿)的数字将会失败

您可以回到这些较长的解决scheme:

 if( parseInt(123456789000) == 123456789000 && 123456789000 > 0 ) 

但是,即使这个解决scheme在某些时候失败了,因为parseInt在大数量上的准确性是有限的。 尝试以下看看会发生什么:

 parseInt(123123123123123123123); // That's 7 "123"s 

在我的电脑上,在Chrome控制台中输出:123123123123123130000

原因是parseInt将input视为一个64位IEEE浮点数。 这仅为尾数提供了52位,这意味着在开始舍入之前最大值为〜4.5e15

1检查正值

在JavaScript简单的比较像: value> == 0没有提供给我们的答案,因为存在-0和+0(这是概念有根源于微分方程)这些值和其属性的贝叶斯的例子:

 var negativeZero = -0; var negativeZero = -1 / Number.POSITIVE_INFINITY; var negativeZero = -Number.MIN_VALUE / Number.POSITIVE_INFINITY; var positiveZero = 0; var positiveZero = 1 / Number.POSITIVE_INFINITY; var positiveZero = Number.MIN_VALUE / Number.POSITIVE_INFINITY; -0 === +0 // true 1 / -0 // -Infinity +0 / -0 // NaN -0 * Number.POSITIVE_INFINITY // NaN 

考虑到这一点,我们可以写下如下的函数来检查给定数字的符号:

 function isPositive (number) { if ( number > 0 ) { return true; } if (number < 0) { return false; } if ( 1 / number === Number.POSITIVE_INFINITY ) { return true; } return false; } 

2a检查数字是一个整数(在math意义上)

要检查这个数字是一个整数,我们可以使用下面的函数:

 function isInteger (number) { return parseInt(number) === number; } //* in ECMA Script 6 use Number.isInteger 

2b检查数字是一个整数(在计算机科学)

在这种情况下,我们正在检查该数字没有任何指数部分(请注意,在JS数字以双精度浮点格式表示)然而,在JavaScript中更容易检查值是“安全整数”( http ://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer ) – 简单的说就是我们可以在“安全整数”中加1 /减1,并确保结果是与math课程中预期的一样。 为了说明我的意思,以下是一些不安全的操作的结果:

 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true Number.MAX_SAFE_INTEGER * 2 + 1 === Number.MAX_SAFE_INTEGER * 2 + 4; // true 

好的,所以要检查这个数字是否是安全整数,我们可以使用Number.MAX_SAFE_INTEGER / Number.MIN_SAFE_INTEGER和parseInt来确保这个数字是整数。

 function isSafeInteger (number) { return parseInt(number) === number && number <== Number.MAX_SAFE_INTEGER && number >== Number.MIN_SAFE_INTEGER } //* in ECMA Script 6 use Number.isSafeInteger 
 if ( values > 0 ) { // Yeah, it's positive } 

简单地写:

 if(values > 0){ //positive } else{ //negative } 
 if(values >= 0) { // as zero is more likely positive than negative } else { } 
 if ( values > 0 ) { //you got a positive value }else{ //you got a negative or zero value } 

如果这是积极的,我想在这里你想要采取行动。

那么会build议:

 if (Math.sign(number_to_test) === 1) { function_to_run_when_positive(); } 

我用在这种情况下,它的作品:)

 var pos = 0; var sign = 0; var zero = 0; var neg = 0; for( var i in arr ) { sign = arr[i] > 0 ? 1 : arr[i] == 0 ? 0 : -1; if (sign === 0) { zero++; } else if (sign === 1 ) { pos++; } else { neg++; } } 

您应该首先检查input值是否与isNumeric()函数相交。 然后添加条件或大于0.这是它的jQuery代码。

 function isPositiveInteger(n) { return ($.isNumeric(n) && (n > 0)); } 

为了检查正整数:

 var isPositiveInteger = function(n) { return ($.isNumeric(n)) && (Math.floor(n) == n) && (n > 0); }