Javascript 如何检查一个数字的计算结果是否为无穷大?

Javascript 如何检查一个数字的计算结果是否为无穷大?,javascript,infinity,Javascript,Infinity,我有一系列Javascript计算(仅在IE下)根据用户选择显示无限 如何阻止单词无限出现,例如,显示0.0 if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY) { // ... } 您可以改为使用该函数,具体取决于您希望如何处理NaNisFinite将返回false if (isFinite(result)) { // ... } 一个简单的n===n+1或n===n/0

我有一系列Javascript计算(仅在IE下)根据用户选择显示无限

如何阻止单词
无限
出现,例如,显示
0.0

if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}
您可以改为使用该函数,具体取决于您希望如何处理
NaN
<如果您的号码是
正无穷
负无穷
NaN
,code>isFinite将返回
false

if (isFinite(result))
{
    // ...
}

一个简单的
n===n+1
n===n/0
工作:

function isInfinite(n) {
  return n === n/0;
}

请注意,本机
isFinite()
强制输入数字<例如,code>isFinite([])和
isFinite(null)
都是
true

实际上n==n+1适用于大于51位的数字,例如

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false
在ES6中,该方法确定传递的值是否为有限数

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

您可以在窗口中使用isFinite
isFinite(123)

您可以编写如下函数:

function isInfinite(num) {
 return !isFinite(num);
}
并使用类似于:

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
您还可以
Number.isFinit
e,它还可以检查值是否也是数字,并且对于检查
未定义的
空的
等更准确

或者您可以polyfill如下所示:

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}

我遇到一个场景,要求我检查值是否为
NaN
Infinity
类型,但传递字符串作为有效结果。由于许多文本字符串将产生误报
NaN
,因此我提出了一个简单的解决方案来避免这种情况:

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

上面的代码将值转换为字符串,并检查它们是否严格等于NaN或无穷大(您需要为负无穷大添加另一种情况)

因此:

我喜欢出于各种防御性编码原因以及可读性使用。ES6
Number.isFinite
非常好,对于非数值没有问题,但是如果ES6不可能,您已经有了lodash,或者想要更简洁的代码:

执行普通ol'比较:
(数字===无限| |数字====无限)
或保存几个字符:

Math.abs(数字)==无穷大
为什么要用这个
  • !(Number.isFinite(Number))
    NaN
    输入上中断
  • 数字。正无限
    数字。负无限
    可以重新定义;是的
  • Infinity
    -Infinity
    是只读的
  • 这是最短的解决方案

  • 为什么要使用
    Number.(正|负)_INFINITY
    而不是
    -?INFINITY
    -?1/0
    ?@Eli:global
    INFINITY
    属性不是只读的,这意味着可以重新定义它:例如,
    var x=42;无穷大=42;警报(x==无穷大)显示“真”。(无可否认,这是一个模糊的例子,任何决定重新定义
    无限
    NaN
    等的人都应该预料会发生奇怪的事情。)忽略
    数字(正|负)_无穷
    也不是只读的事实,
    无限
    在严格模式下是只读的。另外,我向您介绍的
    -?1/0
    案例如何?无论如何,你几乎应该总是使用isFinite来代替。@Eli:在我的测试中,数字是有限的。正无穷大和数字是只读的(在Chrome8、FF3.6和IE8上测试)。使用
    1/0
    可以很好地工作,但对于代码的维护人员来说,您实际要测试的内容并不明显。我同意使用
    isFinite
    几乎总是做事情的更好方法——这就是我在回答中提到它的原因——但只有OP可以决定它是否满足他们的要求。它们不是只读的(读:不可配置),它们只是带有getter的访问器,而不是setter。您可以使用
    Object.defineProperty
    \uu defineGetter\uuu
    重新定义它们<另一方面,代码>无限
    在严格模式下是不可配置的。这应该是对ryanve答案的评论。“工作”是误导性的。从ECMAScript 1中说“也计算为
    true
    ”。这个答案显然是错误的
    n===n+1
    对于大于2^53的所有数字,即1e30,计算结果为真。除法黑客是有效的,即使对于NaN和-Infinity也是如此。然而,LukeH的答案给了你更多可读性的代码。@tglas为什么加号是这样的?很高兴这个部门很稳定。在我看来,我的代码更具可读性和包容性,因为数学比文字更通用。因为IEEE 64位浮点数有53位有效二进制数字(请参阅),所以
    n+1
    无法表示,需要舍入。即使是整数也会受到舍入误差的影响。顺便说一句,我不认为你的代码是“数学证明”,只要试试
    n===n/-0
    。当使用+/-inf完成REAL时,除非假定基础的零序为正,否则您的限制没有得到很好的定义。感谢@tglas,我一直喜欢JavaScript可以被零除:)这篇文章并没有真正处理这里的实际问题,在接受的答案下作为评论会更好。OP是关于数字和无穷大的,而不是字符串和
    NaN
    s等等。你可能是对的,@code\u dredd-这则轶事与此无关。但解决方案仍然有效:它可以检测无穷大的数字——如果我错了,请纠正我。这与问题无关。已经有一个答案说明了如何正确地做到这一点。您所拥有的“有效”仅仅是因为语言本身做了一些愚蠢的事情,并且与它管理类型的方式不一致。请不要再这样写黑客代码了。如果我改用
    toString()
    ,你会更高兴吗?请随意否决或陈述原因,说明这会产生不一致的结果,或者为什么不推荐使用这种方法。到目前为止,我仍然觉得它为寻找答案的人增加了一个选择,而且没有任何具体的理由说明这是丹杰罗
    testInput(1/0); // true
    testInput(parseInt("String")); // true
    testInput("String"); // false
    
    _.isFinite(Infinity); // false
    _.isFinite(NaN); // false
    _.isFinite(-Infinity); // false
    
    _.isFinite(null); // false
    _.isFinite(3); // true
    _.isFinite('3'); // true