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

Xav*_*ier 63 javascript jquery

假设我将值10赋给变量;

var values = 10;
Run Code Online (Sandbox Code Playgroud)

如果值为正,我想运行一个特定的函数

if(values = +integer){ 
    //do something with positive 
} else { 
    //do something with negative values 
}
Run Code Online (Sandbox Code Playgroud)

这将如何实现?

Pet*_*lly 154

if (values > 0) {
    // Do Something
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不会检查该值是否为正*整数*其中整数是整数而不是分数 (3认同)
  • 只想添加一条评论:我注意到最初的问题不仅询问该值是否为正,而且还询问它是否为正整数。为了满足第二个要求,我创建了一个新答案 (2认同)
  • 这里只是一个注释:今天尝试看看我是否有一个正数(int 或 float),并且对于“values=true”,它也评估为“true”。所以...检查“values”是否实际上是一个布尔值! (2认同)

Wol*_*'08 21

要检查,这是最快的方式,似乎:

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

它告诉您符号是正数(返回1)还是等于零(返回0),否则(返回-1).这是一个很好的解决方案,因为0不是正数,并且它不是负数,但它可能是你的变量.

尝试失败:

var sign = number > 0 ? 1 : -1;
Run Code Online (Sandbox Code Playgroud)

... 将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!");}
Run Code Online (Sandbox Code Playgroud)

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


ste*_*esu 19

我是唯一一个读过这个并且意识到没有一个答案解决了问题的"整数"部分的人吗?

问题

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

解决方案

为了保证您正在处理整数,您希望将值转换为整数,然后将其与自身进行比较.

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

一些巧妙的优化

作为奖励,在JavaScript中有一些从float转换为整数的快捷方式.在JavaScript中,所有的位运算符(|,^,&等)将在操作之前投你的号码为整数.我认为这是因为99%的开发人员不知道IEEE浮点标准,并且当"200 | 2"评估为400(ish)时会非常困惑.这些快捷方式的运行速度往往比Math.flooror parseInt,如果你想要尽可能小的代码,它们会占用更少的字节:

if( myInteger | 0 == myInteger && myInteger > 0 )
    // Woot!
if( myFloat | 0 == myFloat && myFloat > 0 )
    // Woot, again!
Run Code Online (Sandbox Code Playgroud)

但等等,还有更多!

这些按位运算符正在处理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)
Run Code Online (Sandbox Code Playgroud)

如果您无法记住这个错综复杂的数字,您也可以事先计算出来:

var specialNumber = ~(1 << 31);
Run Code Online (Sandbox Code Playgroud)

检查底片

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

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

var specialNumber = 1 << 31;
Run Code Online (Sandbox Code Playgroud)

边缘情况

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

您可以回退到这些更长的解决方案:

if( parseInt(123456789000) == 123456789000 && 123456789000 > 0 )
Run Code Online (Sandbox Code Playgroud)

然而,即使这种解决方案在某些时候也失败了,因为parseInt它对于大数量的准确性是有限的.尝试以下操作,看看会发生什么:

parseInt(123123123123123123123); // That's 7 "123"s
Run Code Online (Sandbox Code Playgroud)

在我的计算机上,在Chrome控制台中,输出:123123123123123130000

原因是parseInt将输入视为64位IEEE浮点数.这仅为尾数提供52位,意味着在开始舍入之前最大值为~4.5e15

  • @PeterKelly,恐怕我真的不明白这个问题是如何模棱两可的。他说:“如何检查给出的值是正或负**整数?**”-每个响应都回答“正”部分,而不是“整数”部分。如果没有别的话,我的答案是对他的问题的有效解决方案,并且是关于JavaScript的不错的课程,因此可能不值得投下反对票。 (2认同)
  • @stevendesu这应该是接受的答案,特别是如果你可以修改答案也处理负整数的情况.干得好,感谢这个伟大的榜样 (2认同)

Mic*_*uri 12

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

然后会建议:

if (Math.sign(number_to_test) === 1) {
     function_to_run_when_positive();
}
Run Code Online (Sandbox Code Playgroud)

  • 正面/负面数字唯一正确的芒果. (2认同)

Ank*_*kit 7

简单地写:

if(values > 0){
//positive
}
else{
//negative
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

考虑到这一点,我们可以编写像波纹管这样的函数来检查给定数字的符号:

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

2a检查数字是否为整数(在数学意义上)

要检查该数字是否为整数,我们可以使用以下函数:

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

2b检查数字是否为整数(在计算机科学中)

在这种情况下,我们检查该数字没有任何指数部分(请注意,JS数字以双精度浮点格式表示)但是在javascript中更有用的是检查该值是否为"安全整数"(http ://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) - 简单来说,这意味着我们可以添加/减去1到"安全整数",并确保结果将是与数学课程的预期相同.为了说明我的意思,下面是一些不安全操作的结果:

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2;          // true
Number.MAX_SAFE_INTEGER * 2 + 1 === Number.MAX_SAFE_INTEGER * 2 + 4;  // true
Run Code Online (Sandbox Code Playgroud)

好的,为了检查该数字是否为安全整数,我们可以使用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
Run Code Online (Sandbox Code Playgroud)


Tho*_*ben 6

if(values >= 0) {
 // as zero is more likely positive than negative
} else {

}
Run Code Online (Sandbox Code Playgroud)


Gus*_*ors 5

if ( values > 0 ) {
    // Yeah, it's positive
}
Run Code Online (Sandbox Code Playgroud)


Var*_*run 5

if ( values > 0 ) {
    //you got a positive value
}else{
    //you got a negative or zero value    
}
Run Code Online (Sandbox Code Playgroud)


小智 5

检查一个数是正数、负数还是负零。使用Math.sign()方法检查其符号, 它将根据正负和负零或零数为您提供 -1、-0、0 和 1

 Math.sign(-3) // -1
 Math.sign(3) // 1
 Math.sign(-0) // -0
 Math.sign(0) // 0
Run Code Online (Sandbox Code Playgroud)


Mar*_*rco 5

我知道已经有一段时间了,但是有一个更优雅的解决方案。来自 Mozilla 文档

Math.sign(parseInt(-3))
Run Code Online (Sandbox Code Playgroud)

它会给你 -1 代表负数,0 代表零,1 代表正数。