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


76

假设我为变量分配了值10;

var values = 10;

我想运行一个特定的功能,如果该值是一个正数

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

如何实现?


我假设您要递增/递减变量。如果是这样,为什么不编写一个if条件来在变量增加/减少后检查该值?
Sagar V

12
提出了这个问题-今天我有个大脑袋,试图弄清楚今天如何确定Javascript中的数字是正数还是负数。我想是时候该休息一下编程了.....
jedd.ahyoung 2013年

这个问题在2011

Answers:


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

2
只想添加一条评论:我注意到最初的问题不仅询问该值是否为正,而且询问它是否为正整数。为了满足第二个要求,我创建了一个新的答案
stevendesu 2014年

请注意-2.2737367544323206e-13之类的数字(即:几乎为零)。我觉得这个讨论insteresting:stackoverflow.com/questions/588004/...
thicolares

3
此答案不会检查值是否为正整数,其中整数是整数而不是分数
Reinsbrain 2015年

1
此处只是个注释:今天尝试了一下,看看我是否有一个正数(整数或浮点数),并且也对进行true了评估values=true。所以...检查是否values实际上是布尔值!
wullxz

23

仅检查一下,这似乎是最快的方法:

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)。这是一个很好的解决方案,因为0不是正数,也不是负数,但这可能是您的var。

尝试失败:

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

22

我是唯一读过此书并意识到答案没有解决问题的“整数”部分的人吗?

问题

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!

解决方案

为了确保您正在处理整数,您需要将值转换为整数,然后将其与自身进行比较。

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,并且如果您尝试计算出尽可能小的代码,它们将占用更少的字节:

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);

检查底片

根据@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亿)的数字将失败

您可以使用以下较长的解决方案:

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

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

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

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

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


我应该注意,这不适用于大于2147483647的整数。例如:99999999999 & 2147483647 = 1215752191
stevendesu 2014年

实际上,该问题并不要求检查它是否为整数类型以及该整数是否为正。它询问'var values = 10'是否为正整数,如提供的代码所示,这就是我们要处理的全部。
彼得·凯利

2
@PeterKelly,恐怕我真的不明白这个问题是如何模棱两可的。他说:“如何检查给出的值是正整数还是负整数? ”-每个响应都回答“正”部分,而不回答“整数”部分。如果没有别的话,我的答案是对他的问题的有效解决方案,并且是关于JavaScript的不错的课程,因此可能不值得投下反对票。
stevendesu 2014年

1
@stevendesu是正确的。整数是问题的一部分。
Mohamed Anis Dahmani 2015年

2
@stevendesu,这应该是可接受的答案,尤其是如果您可以修改答案以处理负整数的情况。出色的工作,感谢您的出色榜样
Reinsbrain


7

只需写:

if(values > 0){
//positive
}
else{
//negative
}

7

1检查正值

在javascript中,像这样的简单比较:值> == 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检查数字是否为整数(在数学意义上)

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

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,并确保结果为与数学课程中预期的相同。为了说明我的意思,以下是一些不安全操作的结果:

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

+1我认为这比我的回答要好,因为它涵盖了负零和MAX_SAFE_INTEGER的极端情况。我的答案给出了一个很棒的高性能短手解决方案,但仅仅掩盖了边缘情况。
stevendesu

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

}


5
if ( values > 0 ) {
    //you got a positive value
}else{
    //you got a negative or zero value    
}

4

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

 Math.sign(-3) // -1
 Math.sign(3) // 1
 Math.sign(-0) // -0
 Math.sign(0) // 0

2

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

Math.sign(parseInt(-3))

负数为-1,零数为0,正数为1。



0

我在这种情况下使用,它有效:)

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

0

您应该首先检查输入值是否与isNumeric()函数进行整数运算。然后添加条件或大于0。这是它的jQuery代码。

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

0

从接收到的值是数字而不是字符串的基数开始,使用Math.abs()怎么样?此JavaScript本机函数返回数字的绝对值:

Math.abs(-1) // 1

因此,您可以通过以下方式使用它:

var a = -1;
if(a == Math.abs(a)){
    // false 
}

var b = 1;   
if(b == Math.abs(b)){
    // true
}

0

您可以使用移位位运算符,但它希望获得-0+0一样的区别Math.sign(x)

let num = -45;
if(num >> 31 === -1)
    alert('Negative number');
else
    alert('Positive number');

https://jsfiddle.net/obxptgze/


-1

用于检查正整数:

var isPositiveInteger = function(n) {
        return ($.isNumeric(n)) && (Math.floor(n) == n) && (n > 0); 
}
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.