如何检查一个数字是不是为负数?

Posted

技术标签:

【中文标题】如何检查一个数字是不是为负数?【英文标题】:How to check if a number is negative?如何检查一个数字是否为负数? 【发布时间】:2011-04-04 01:22:45 【问题描述】:

我想检查一个数字是否为负数。我正在寻找最简单的方法,所以预定义的 javascript 函数是最好的,但我还没有找到任何东西。这是我目前所拥有的,但我认为这不是一个好方法:

function negative(number) 
  if (number.match(/^-\d+$/)) 
    return true;
   else 
    return false;
  

【问题讨论】:

只是质疑你的正则表达式。 -0 呢? Math.sign() ... ? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 【参考方案1】:

您应该能够使用以下表达式,而不是编写一个函数来执行此检查:

(number < 0)

Javascript 将通过首先尝试将左侧转换为数字值来评估此表达式,然后检查它是否小于零,这似乎是您想要的。


规格和细节

x &lt; y 的行为在 §11.8.1 小于运算符 (&lt;) 中指定,它使用 §11.8.5 抽象关系比较算法 em>。

如果xy 都是字符串,情况就大不相同了,但由于右侧已经是(number &lt; 0) 中的数字,比较将尝试将左侧转换为数字进行数值比较。如果左边不能转换为数字,则结果为false

请注意,与基于正则表达式的方法相比,这可能会产生不同的结果,但取决于您尝试做什么,它最终可能会做正确的事情。

"-0" &lt; 0false,这与-0 &lt; 0 也是false 的事实一致 (参见:signed zero)。 "-Infinity" &lt; 0true(确认无穷大) "-1e0" &lt; 0true(接受科学记数法文字) "-0x1" &lt; 0true(接受十六进制文字) " -1 " &lt; 0true(允许使用某些形式的空格)

对于上述每个示例,正则表达式方法的结果都会相反(true 而不是 false,反之亦然)。

参考文献

ECMAScript 5 (PDF) ECMAScript 3, §11.8.1 The Less-than Operator (&lt;) ECMAScript 3, §11.8.5 The Abstract Relational Comparison Algorithm

另见

regular-expressions.info/Matching Floating Point Numbers with a Regular Expression

附录一:条件运算符?:

也应该说这种形式的陈述:

if (someCondition) 
   return valueForTrue;
 else 
   return valueForFalse;

可以重构为使用三元/条件 ?: 运算符 (§11.12) 来简单地:

return (someCondition) ? valueForTrue : valueForFalse;

?: 的惯用用法可以使代码更加简洁易读。

相关问题

javascript if alternative To Ternary or Not To Ternary?

附录2:类型转换函数

Javascript 具有可以调用来执行各种类型转换的函数。

类似于以下内容:

if (someVariable) 
   return true;
 else 
   return false;

可以使用?: 运算符重构为:

return (someVariable ? true : false);

但您也可以进一步简化为:

return Boolean(someVariable);

这会调用 Boolean 作为函数 (§15.16.1) 来执行所需的类型转换。类似地,您可以将 Number 作为函数 (§15.17.1) 调用以执行到数字的转换。

相关问题

How can I convert a string to boolean in JavaScript? what is the purpose of javascript new Boolean() ?

【讨论】:

@poly,在 ECMAScript 5 中,它归结为 11.8.5(抽象关系比较)。除非 both 两边都是字符串,否则抽象操作 ToNumber 在第 3 步期间在两边都运行。 @poly,我之前应该回到 11.8.1(小于运算符)。第 6 步显式强制 undefined 为 false。这也适用于其他关系运算符。可能,他们认为总是评估为真或假会更简单,即使 undefined 是假的。 不需要return (condition); 中的括号,它们什么也没做。此外,这并不等同于您所说的代码,因为它将返回 condition 对象本身而不是布尔值。也许你的意思是return !!condition 是的,这行得通。我还是更喜欢!!,因为使用Boolean 涉及额外的函数调用,因此速度较慢,而且字符数也更多。 @Tim, @Matthew:好的,所以在下一个修订版中,我计划有附录 3,使用运算符进行类型转换,用双补码代替 Boolean,用一元加号代替 Number。还有什么我应该补充的吗?我想也许~~ 也可以代替+,但这就是我能想到的。【参考方案2】:
function negative(n) 
  return n < 0;

您的正则表达式应该可以很好地处理字符串数字,但这可能更快。 (根据上述类似答案中的评论编辑,不需要使用+n 进行转换。)

【讨论】:

【参考方案3】:

这是一个老问题,但它有很多观点,所以我认为更新它很重要。

ECMAScript 6 带来了函数Math.sign(),它返回一个数字的符号(如果是正数则返回1,如果是负数则返回-1)或如果不是数字则返回NaN。 Reference

您可以将其用作:

var number = 1;

if(Math.sign(number) === 1)
    alert("I'm positive");
else if(Math.sign(number) === -1)
    alert("I'm negative");
else
    alert("I'm not a number");

【讨论】:

不错,但目前浏览器和移动设备支持受限于:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案4】:

这样简单的事情怎么样:

function negative(number)
    return number < 0;

* 1部分是将字符串转换为数字。

【讨论】:

* 1 不是必需的,因为比较会在需要时进行隐式字符串->数字转换。 @Matthew Flaschen:我不确定所有浏览器中的行为是否一致,所以我添加了它。您能否确认这在所有浏览器中都是一致的,因为我记得过去遇到过一些问题。 如果您担心确保将其转换为数字,+number 不会做同样的事情吗? @Gabe:不,不会。尝试做'foo' + 1,你会得到'foo1'。因此,如果您想强制转换为数字,通常最简单的方法是使用 *1 +number 将比number * 1 更有效,但在这种情况下,&lt; 将导致ToPrimitivenumber 单独调用,并带有提示Number。这种行为在规范中,并且在所有实现中都是一致的。【参考方案5】:

在 ES6 中,您可以使用 Math.sign 函数来确定是否,

1. its +ve no
2. its -ve no
3. its zero (0)
4. its NaN


console.log(Math.sign(1))        // prints 1 
console.log(Math.sign(-1))       // prints -1
console.log(Math.sign(0))        // prints 0
console.log(Math.sign("abcd"))   // prints NaN

【讨论】:

【参考方案6】:

如果你真的想深入研究,甚至需要区分-00,这里有一个方法。

function negative(number) 
  return !Object.is(Math.abs(number), +number);


console.log(negative(-1));  // true
console.log(negative(1));   // false
console.log(negative(0));   // false
console.log(negative(-0));  // true

【讨论】:

【参考方案7】:

一种同时检查正面和负面的好方法......

function ispositive(n)
    return 1/(n*0)===1/0


console.log( ispositive(10) )  //true
console.log( ispositive(-10) )  //false
console.log( ispositive(0) )  //true
console.log( ispositive(-0) )  //false

基本上将Infinity-Infinity 进行比较,因为0===-0// true

【讨论】:

以上是关于如何检查一个数字是不是为负数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]

如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]

错误检查:如检查负数,或输入不是数字。

js如何判断一个数字是正数还是负数

检查数字是不是为负并在 Racket 中使用绝对值

用js怎么判断输入一个必须是数字?包括负数和整数