JavaScript:64位对数字的影响

JavaScript:64位对数字的影响,javascript,numbers,64-bit,Javascript,Numbers,64 Bit,我正在阅读有说服力的JavaScript,我被这个解释“卡住了”,起初我以为我会跳过它,但后来我试着回到它,我不能理解它,我试着用谷歌搜索64位的反响和类似的东西,但我没有找到答案 我只是不明白一些东西,比如,什么是10^3?为什么它被限制为三位小数?我试着键入1.9999999999,结果成功了,有没有什么地方可以让我不跳过就完全理解这个句子?我在某个地方读到javascript在近似方面有问题,比如2.000000000可能是2.000000000001,这可能会导致问题,但这本书的这一部分

我正在阅读有说服力的JavaScript,我被这个解释“卡住了”,起初我以为我会跳过它,但后来我试着回到它,我不能理解它,我试着用谷歌搜索64位的反响和类似的东西,但我没有找到答案

我只是不明白一些东西,比如,什么是
10^3?
为什么它被限制为三位小数?我试着键入
1.9999999999
,结果成功了,有没有什么地方可以让我不跳过就完全理解这个句子?我在某个地方读到javascript在近似方面有问题,比如
2.000000000
可能是
2.000000000001
,这可能会导致问题,但这本书的这一部分对我来说似乎并不类似

谢谢你的帮助

这是我听不懂的部分


这非常简单。打开控制台并键入:

0.1+0.2
根据JS,这将是
0.300000000004
。这就是近似的问题。这是因为JS对浮动使用规范。
更多关于这个话题

10^3在JS中是
Math.pow(10,3)
,即
10*10*10
+('10'+'0'+'0')
,即1000。因此,三个十进制(10个可能的数字字符(0-9))允许10*10*10个组合,范围从000到999=>1000个组合。
JavaScript没有将您限制为三个十进制数字,它有64位数字,并使用11位来定位小数点

在这里,“浮点”这个名字是一个线索。小数点可以浮动。而不是使用固定数量的位来表示整数,然后使用固定数量的位来指定非整数部分:

//pseudo: assume 16 bits
00000011 00000000
如果小数点是固定的(位的中间是点),则表示3。这并不理想,因此点的位置可以在JS中浮动:

最后11位保留点位置,在本例中,
3
是一个整数,因此没有小数点

编写
2.9999999
时,数字本身表示为一个整数(位为1或0,中间没有)

然后,最后11位将是:

00000010100
这会将浮点移动到第20个位置:

10[.]11011100011010111111
这将生成整数:
10
,或2,后跟点,依此类推

那么?有什么问题吗?

简单:虽然JS使用64位表示其数字,但其中1位表示负数/正数,11位表示点的位置,给数字本身留下52位,或
2^52
0和1的可能组合(~10^15组合)

就其本身而言,这听起来似乎足够了,但重点是浮动的。整数确实可以是巨大的,但是对于你添加的每一个十进制数字,你会拿走一点,它会吃掉你的数字可能的最大值


由于失去万亿分之一的东西通常比失去万亿分之一的东西危害更小,所以数字越大,浮点数被向后推,有效数字(精度)丢失,以容纳更大的数字,但只有在需要时

反响只是英语句子的一部分,它不是一个专业术语:“这有一个重要的反响”只是指他要指出他所说的内容的一个重要影响,在这种情况下javascript只能表达有限数量的数字,我们可以计算这个数量

十乘以三的幂等于1000,这只是基础数学。他以此为例,解释了只有三位数字可以写多少个数字(可以写1000个,即从0到999的所有数字)。同样,如果你有四个数字,你可以把十写成四个数字的幂(10000,即从0到9999的所有数字)。它是某物的十次方,因为我们使用十进制数系统,根据定义,它是基于十次方的(如果你仍然不确定,请查找数字/基本系统:十进制、二进制、十六进制和八进制是计算中最常用的)

然后他继续讨论二进制数,javascript(以及几乎所有编程语言)中的数字系统都使用二进制数:二进制数是2的幂,而不是10的幂,因为二进制数是基数2,而十进制数是基数10。所以,同样,当你想找到你能表达的数字的数量时,你要计算出基数与你拥有的数字的幂的关系,因为javascript可以存储64个二进制(‘基数2’)数字,我们需要计算出2与64的幂的关系,这恰好是一个非常大的数字——在你的计算器或谷歌上试试(在搜索框中输入2^64)

然而,正如他所说,事实上并非所有这些都可用,因为十进制和负数是如何存储的。如果你对更多细节感兴趣,我建议你阅读Charles Petzold的《代码:计算机硬件和软件的隐藏语言》一书,因为他为新手提供了可靠但简单的解释。好的一面是,为了编写好的javascript,您很少需要了解javascript数字系统的内部细节!但是所有的知识都是好的

1011011100011010111111
00000010100
10[.]11011100011010111111