Javascript 如何检查一个数字的计算结果是否为无穷大?
我有一系列Javascript计算(仅在IE下)根据用户选择显示无限 如何阻止单词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
无限
出现,例如,显示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或无穷大(您需要为负无穷大添加另一种情况)
因此:
我喜欢出于各种防御性编码原因以及可读性使用。ES6Number.isFinite
非常好,对于非数值没有问题,但是如果ES6不可能,您已经有了lodash,或者想要更简洁的代码:
执行普通ol'比较:
(数字===无限| |数字====无限)
或保存几个字符:
Math.abs(数字)==无穷大
为什么要用这个
!(Number.isFinite(Number))
在NaN
输入上中断
数字。正无限
和数字。负无限
可以重新定义;是的
Infinity
和-Infinity
是只读的
这是最短的解决方案
为什么要使用Number.(正|负)_INFINITY
而不是-?INFINITY
或-?1/0
?@Eli:globalINFINITY
属性不是只读的,这意味着可以重新定义它:例如,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