我有一系列Javascript计算,根据用户选择会在IE中显示Infinity。
如何阻止出现单词Infinity
,而是显示0.0
?
我有一系列Javascript计算,根据用户选择会在IE中显示Infinity。
如何阻止出现单词Infinity
,而是显示0.0
?
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
你可以根据需要处理 "NaN",并可能使用isFinite
函数。如果你的数字是POSITIVE_INFINITY
、NEGATIVE_INFINITY
或NaN
,则isFinite
返回false
。if (isFinite(result))
{
// ...
}
在ES6
中,Number.isFinite()
方法用于确定传递的值是否为有限数字。
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
一个简单的 n === n+1
或 n === n/0
即可:
function isInfinite(n) {
return n === n/0;
}
请注意,本地的isFinite()
会将输入强制转换为数字。例如,isFinite([])
和isFinite(null)
都是true
。
n === n+1
都会评估为true。除法hack也适用于NaN和-Infinity。然而,LukeH的答案提供了更易读的代码。 - tglasn + 1
无法表示并且可能会受到舍入的影响。 好吧,即使整数也会受到舍入误差的影响。 另外,我不认为你的代码是“数学证明”,可以尝试 n === n/-0
。 当使用 +/-inf 完成实数时,除非假定底层零序列为正数,否则您的极限没有定义良好。 - tglas实际上,n === n + 1 对于大于 51 位的数字也是有效的,例如:
1e16 + 1 === 1e16; // true
1e16 === Infinity; // false
true
”。 - Константин Ван我喜欢使用Lodash,因为它具有多种防御性编码的原因以及可读性。ES6 Number.isFinite
非常好,不会出现非数字值的问题,但如果无法使用ES6,您已经拥有了Lodash,或者想要更简洁的代码:_.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
NaN
或 Infinity
类型,但要将字符串作为有效结果传递。因为许多文本字符串将产生误报的 NaN
,所以我制定了一个简单的解决方案来规避这个问题: const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
上述代码将值转换为字符串,并检查它们是否严格等于NaN或Infinity(您需要添加另一个负无穷大的情况)。
因此:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
等内容。 - code_dreddtoString()
会让你更开心吗?请随意点踩或说明原因,说明这可能会产生不一致的结果或为什么不推荐使用该方法。到目前为止,我仍然认为它为寻找答案的人提供了一个选项,并且没有任何具体的原因说明这是危险的、不稳定的等等。 - dmitrizzle在编程中,你可以使用 window 下的 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.isFinite
,它还会检查值是否为数字,并且对于检查 undefined
和 null
等更准确。
或者你可以像这样进行 polyfill:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
而不是-?Infinity
或者-?1/0
? - Eli GreyInfinity
属性不是只读的,这意味着它可以被重新定义:例如,var x = 42; Infinity = 42; alert(x === Infinity);
将显示“true”。(尽管这是一个晦涩的情况,但任何决定重新定义Infinity
、NaN
等的人都应该预料到会发生奇怪的事情。) - LukeHNumber.(POSITIVE|NEGATIVE)_INFINITY
不是只读的事实,Infinity
在严格模式下确实是只读的。另外,关于我向你演示的-?1/0
情况呢?总之,几乎总是应该使用isFinite
。 - Eli GreyNumber.POSITIVE_INFINITY
和Number.NEGATIVE_INFINITY
是只读的(在Chrome8、FF3.6和IE8上测试过)。使用1/0
可以正常工作,但对于代码维护者来说,你实际上想要测试什么可能不太明显。我同意使用isFinite
几乎总是更好的方法——这就是为什么我在我的答案中提到它的原因——但只有OP可以决定它是否符合他们的要求。 - LukeHObject.defineProperty
和__defineGetter__
重新定义它们。另一方面,在严格模式下,Infinity
是不可配置的。 - Eli Grey