如何检查数字是否为无穷大?


94

我有一系列Javascript计算(仅在IE下),取决于用户选择,显示Infinity。

如何阻止单词Infinity出现,例如0.0改为显示?

Answers:


174
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

您可能可以改用该isFinite函数,具体取决于您要如何对待NaN。如果您的电话号码是或,则isFinite返回。falsePOSITIVE_INFINITYNEGATIVE_INFINITYNaN

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

2
为什么使用Number.(POSITIVE|NEGATIVE)_INFINITY代替-?Infinity-?1/0
伊莱·格雷

5
@Eli:全局Infinity属性不是只读的,这意味着可以重新定义它:例如,var x = 42; Infinity = 42; alert(x === Infinity);显示“ true”。(诚然,这是一个模糊的情况下,任何人都谁决定重新定义InfinityNaN等应该期待奇怪的事情发生。)
LukeH

在严格模式下Number.(POSITIVE|NEGATIVE)_INFINITY,忽略也不是只读的事实Infinity 也是只读的。另外,-?1/0我向您介绍的案件又如何呢?无论如何,您几乎应该始终使用它isFinite
伊莱·格雷

1
@Eli:在我的测试Number.POSITIVE_INFINITY,并Number.NEGATIVE_INFINITY 只读(上Chrome8,FF3.6和IE8测试)。使用1/0效果很好,但是对于您的代码维护人员来说,您实际要测试的内容并不是那么明显。我同意使用isFinite操作几乎总是更好的方法-这就是为什么我在回答中提到它-但只有OP可以决定它是否满足他们的要求。
路加福音

4
它们不是只读的(只读:不可配置的),它们只是具有getter而不是setter的访问器。您可以使用Object.defineProperty和重新定义它们__defineGetter__Infinity,在另一方面,在严格模式下不可配置。
伊莱·格雷

9

一个简单的n === n+1还是n === n/0可行的:

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

请注意,本机isFinite()强制输入数字。isFinite([])isFinite(null)两者都是true


这个答案是完全错误的。n === n+1对于所有大于2 ^ 53(即1e30)的数字,其计算结果为true。该部门的黑客甚至对NaN和-Infinity也有效。但是,LukeH的答案可以使您更容易阅读。
tglas

@tglas为什么这样的加号?很高兴该部门扎实。IMO我的代码更具可读性和包容性,因为数学比单词更通用。
ryanve

1
由于IEEE 64位浮点数具有53个有效的二进制数字(请参阅en.wikipedia.org/wiki/IEEE_754),因此n+1无法表示,并且需要取整。好吧,即使整数也会受到舍入误差的影响。顺便说一句,我不认为您的代码是“防数学的”,只需尝试n === n/-0。当用+/- inf填充实数时,除非假设零位序列为正,否则您的界限不确定。
tglas

谢谢@tglas,我将永远喜欢JavaScript可以被零除:)
ryanve 18/09/18

6

在中ES6,该Number.isFinite()方法确定传递的值是否为有限数。

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

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

从ECMAScript 1访问
MohaMad'17

2

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

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

3
这应该是对ryanve答案的评论。
加里

1

我喜欢出于各种防御性编码原因以及可读性而使用Lodash。ES6 很棒,并且没有非数值问题,但是如果ES6不可能,那么您已经有破折号,或者想要更简短的代码:_.isFiniteNumber.isFinite

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

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

0

我遇到了一种情况,要求我检查该值是否为NaNInfinity类型,但将字符串作为有效结果传递。由于许多文本字符串都会产生假阳性NaN,因此我制定了一个简单的解决方案来规避这一问题:

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

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

所以:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

这篇文章并没有真正解决这里的实际问题,最好是在接受的答案下作为评论。OP是关于数字和无穷大,不是字符串和NaNs等
。– code_dredd

@code_dredd您可能是正确的-轶事无关。但是解决方案仍然有效:它可以检测到无穷大数-如果我错了,请纠正我。
dmitrizzle,

那不是重点。已经有一个答案,说明如何正确执行此操作。您拥有的“工作”仅仅是因为该语言本身做了愚蠢的事情,并且与它管理类型的方式不一致。请避免编写此类黑客代码。
code_dredd

如果我toString()改用它,会让您更快乐吗?请随意投票或说明原因,以免产生不一致的结果,或者为什么不建议使用此方法。到目前为止,我仍然觉得它为任何正在寻找答案的人提供了一个选择,并且没有任何具体的原因说明这样做的危险性,不稳定性等
。– dmitrizzle

-1

您可以在窗口中使用isFiniteisFinite(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è也检查值数过,是检查更精确undefinednull等...

或者您可以像这样填充它:

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}
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.