【问题标题】:How does JavaScript handle integers?JavaScript 如何处理整数?
【发布时间】:2016-03-31 18:43:15
【问题描述】:

上下文

我有一个 sn-p 代码,它允许用户单击“变量(任意)元素”,提示输入数字,并查看在他们单击的元素中/上生成的该数字的处理版本,基于“变量函数”。我将在下面提供更详尽的描述和原始代码。跳到底部的问题。

详尽的描述

我有一个看起来像square(root) { return root * root; } 的函数。显然,它需要一个数字并返回该数字乘以自身。我还有一个这样的printNum(input) { return input; } - 希望不需要解释。

浏览器使用一个针对var element = document.getElementById("unique-key") 的事件监听器调用它们,看起来像element.addEventListener('click', promptFunction);

promptFunction 使用var functionPlug =[functionsListedAbove]; 将输入从window.prompt('inputvar') 指向element.innerHTML

原码

//where to write
var element = document.getElementById("module");

//what to write
var functionPlug = printNum;



//how to write
function square(root)      { return root * root; }
function printNum(input)   { return input * input / input; }



//write
function promptFunction()  { element.innerHTML = functionPlug(window.prompt('inputvar')); }



//When to write
element.addEventListener('click', promptFunction);
//promptFunction(); --immediately
body {

 background-color: #3A3C3D; 		/*alt color #CCA #3A3C3D*/
 margin: 0;
 overflow: hidden;					/*top stop the extended shadow element height from causing the page to scroll*/
}



.backDrop {

 background-color: #FFF; 			/*alt colors #ACA null #CCA*/
 margin: auto;
 height: 100vh; width: 720px;
}
.backDrop:before {

 box-shadow: 0 0 20px black;
 content:'';
 position: absolute;
 height: 200vh; width: 720px;
 margin: auto;
 z-index: -1;
}



.lineBreak {

 height: 16px;
}



.module {

 border-left: 2px dotted red;
 border-radius: 5px;
 box-shadow: 0 0 5px -2px rgba(0,0,0,.4);
 margin: auto;
 height: 270px; width: 480px;
}
<body><!--All the comments you'll see below are meant to null 'white space' between layout elements--><!--
 --><div class="backDrop" id="backDrop"><!--
	 --><div class="lineBreak"></div><!--
	 --><div class="module" id="module"></div>
	</div>

现在回答我的问题

似乎我的 square 函数运行良好,但 printNum 有一些非常奇怪的行为,我需要向我解释一下。

输入范围从 9 到 9999999 会产生您期望的数字。

输入 99999999 产生 99999998.99999999

输入 999999999 到 9999999999 会产生您期望的数字。

输入 999999999999 产生 99999999999.00002

输入 9999999999999 到 999999999999999 会产生您期望的数字

最后 9999999999999999 产生 10000000000000000

我想我理解最后一个,因为它是 16 位数字,但我仍然想跳出猜测的领域。

还有其他数字会产生奇怪的结果吗?他们是什么,他们为什么这样做?还有如何避免 e 符号?

【问题讨论】:

标签: javascript string types integer


【解决方案1】:

你的文字是printNum(input) { return input; },但在原始代码中,有function printNum(input) { return input * input / input; }。这很重要。

问题

所以基本上,你的问题可以归结为javascript为什么要这样做:

99999999 * 99999999 / 99999999 == 99999998.99999999
999999999999 * 999999999999 / 999999999999 == 99999999999.00002
9999999999999999 == 10000000000000000

顺便说一句,第二个(999999999999)在我的 Chrome 中不正确

答案

许多编程语言都明确区分了整数和浮点数(因为 CPU 也是如此)。 JavaScript 没有。它有一个Number 类型,它实际上是一个双精度浮点数(C 中的double),但尽可能看起来像一个整数。

浮点数可以显示比整数大得多的数字并且可以有小数,但它的代价是失去精度,尤其是对于大数字。

你会想知道有多大。您可以查看Number.MAX_SAFE_INTEGER。对于大于此的数字,不能保证它们将具有整数的精度。

例如:

Number.MAX_SAFE_INTEGER == 9007199254740991
Number.MAX_SAFE_INTEGER + 1 == 9007199254740992
Number.MAX_SAFE_INTEGER + 2 == 9007199254740992
Number.MAX_SAFE_INTEGER + 1 == Number.MAX_SAFE_INTEGER + 2

在您的情况下,您遇到问题是因为:

99999999 * 99999999 > Number.MAX_SAFE_INTEGER
9999999999999999 > Number.MAX_SAFE_INTEGER

更多

如果您仍然不明白为什么浮点数会出现问题,请参阅以下内容:

http://www.w3schools.com/js/js_numbers.asp

Floating point inaccuracy examples

【讨论】:

  • 通过阅读您的回答,我意识到我可能无法问我需要问的实际问题,如果有,它不太可能在 stackoverflow 上的帖子中得到回答。但是您设法向我介绍了许多新概念,我怀疑我是否曾经自己阅读过,并且您暴露了一些有关该语言的关键知识,并且这样做解决了我的问题。谢谢。
  • @Musixauce3000 我很高兴它有帮助:) 顺便说一句,我认为人们必须有编程问题,他们的主要麻烦是弄清楚要问什么。之后,答案就很简单了。
猜你喜欢
  • 2019-02-20
  • 2022-08-17
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多