Javascript -- 将数字用作整数可靠吗?
Javascript -- reliable to use numbers as integers?
为什么在 Javascript 中将数字用作整数显然是安全的?我的意思是,像下面这样的循环通常是 "trusted" 到 运行 预期的次数,即使最终循环需要精确比较 (10000 == 10000) 时这两个值是浮点数而不是整数。是否有某种内置的舍入功能使它安全可靠——或者这是可怕且不可信的编码?谢谢
--编辑--
有趣的是,有一个声明的安全整数范围。我不知道 MAX_SAFE_INTEGER。我们都知道 2 + 2 = 3.9999 的标准抱怨。我注意到 MAX_SAFE_INTEGER 被列为 ECMAScript-6 那么这是否意味着 IEEE-754 实际上没有提到安全整数范围?
var cnt = 0;
for (var i=0 ; i<=10000 ; i++){
// loop 10001 times
cnt++;
}
alert('cnt = '+ cnt);
首先,最终循环不要求两个值相等。只是 i
小于 10000
.
其次,JavaScript 中的 Number
类型将整数值准确地向上(和向下)到一个点。您可以访问 Number.MAX_SAFE_INTEGER
和 Number.MIN_SAFE_INTEGER
属性来查看您的 browser/engine.
的安全范围是多少
如果你想检查 Number
的实例是否为整数,只需使用 Number.isInteger()
方法。
var i = 10, e = document.getElementById('message');
if(Number.isInteger(i)) {
e.innerHTML = "i is an integer";
} else {
e.innerHTML = "i is not an integer";
}
<div id='message'></div>
IEEE-754 双精度浮点数(JavaScript 使用的那种)有一个非常 宽的范围,它们精确地 表示整数,特别是 -9,007,199,254,740,991 到 9,007,199,254,740,991。 (这些值作为常量添加到 JavaScript 的 Number
函数中:MIN_SAFE_INTEGER
and MAX_SAFE_INTEGER
。)超出该范围,您确实可能 运行 陷入困境。
事实上,如果不是safety
,这个循环永远不会结束:
var n, safety;
safety = 0;
for (n = 9007199254740990; n != 9007199254740999; ++n) {
if (++safety === 20) { // Long after `n` should have matched
snippet.log("Had to break out!");
break;
}
snippet.log("n = " + n);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
为什么在 Javascript 中将数字用作整数显然是安全的?我的意思是,像下面这样的循环通常是 "trusted" 到 运行 预期的次数,即使最终循环需要精确比较 (10000 == 10000) 时这两个值是浮点数而不是整数。是否有某种内置的舍入功能使它安全可靠——或者这是可怕且不可信的编码?谢谢
--编辑--
有趣的是,有一个声明的安全整数范围。我不知道 MAX_SAFE_INTEGER。我们都知道 2 + 2 = 3.9999 的标准抱怨。我注意到 MAX_SAFE_INTEGER 被列为 ECMAScript-6 那么这是否意味着 IEEE-754 实际上没有提到安全整数范围?
var cnt = 0;
for (var i=0 ; i<=10000 ; i++){
// loop 10001 times
cnt++;
}
alert('cnt = '+ cnt);
首先,最终循环不要求两个值相等。只是 i
小于 10000
.
其次,JavaScript 中的 Number
类型将整数值准确地向上(和向下)到一个点。您可以访问 Number.MAX_SAFE_INTEGER
和 Number.MIN_SAFE_INTEGER
属性来查看您的 browser/engine.
如果你想检查 Number
的实例是否为整数,只需使用 Number.isInteger()
方法。
var i = 10, e = document.getElementById('message');
if(Number.isInteger(i)) {
e.innerHTML = "i is an integer";
} else {
e.innerHTML = "i is not an integer";
}
<div id='message'></div>
IEEE-754 双精度浮点数(JavaScript 使用的那种)有一个非常 宽的范围,它们精确地 表示整数,特别是 -9,007,199,254,740,991 到 9,007,199,254,740,991。 (这些值作为常量添加到 JavaScript 的 Number
函数中:MIN_SAFE_INTEGER
and MAX_SAFE_INTEGER
。)超出该范围,您确实可能 运行 陷入困境。
事实上,如果不是safety
,这个循环永远不会结束:
var n, safety;
safety = 0;
for (n = 9007199254740990; n != 9007199254740999; ++n) {
if (++safety === 20) { // Long after `n` should have matched
snippet.log("Had to break out!");
break;
}
snippet.log("n = " + n);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>