JS数字存储问题

数字存储

在对精度要求很高的系统中,或要对小数的运算结果进行比较时,需要特别谨慎

问题

  1. JS中的小数运算是精确的嘛?

不一定

  1. JS中的整数运算是精确的嘛?

不一定

  1. JS中表示的整数时连续的嘛?

ON

  1. JS中表示的最大数字是多少?

最大连续整数 : 1~能掰手指头 window.Number.MAX_SAFE_INTEGER

  1. JS中能表示的数字有效位数是多少?

16 ~ 17 位

二进制

现实世界中: 十进制,10个数字,缝十进一

计算机世界中:二进制,2个数字,缝二进一

二进制 --> 十进制

1101 --> 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 = 13 1*2^3 + 1 * 2^2 + 0*2^1 + 1*2^0 = 13 123+122+021+120=13

11.01 --> 1 ∗ 2 1 + 1 ∗ 2 0 + 0 ∗ 2 − 1 + 1 ∗ 2 − 2 = 3.25 1*2^1 + 1*2^0 + 0*2^{-1} + 1*2^{-2} = 3.25 121+120+021+122=3.25

十进制转二进制

13 -->

13 / 2 商 6 余 1
6 / 2 商 3 余 0
3 / 2 商 1 余 1
1 / 2 商 0 余 1
余数从下往上看

3.25 -->11

整数部分一样

小数部分

0.25 *    2    0.5    整数部分 : 0
0.5  *    2    1.0    整数部分 :  1
整数部分从上往下看

为什么JS的小数运算不精确

十进制的小数,转换位二进制后,可能是无限小数,但是计算机对数字存储能力有限,因此会丢失一些数据

  • 十进制数 0.3 --> 0。01001100110011001100………………
    结果所以JS小数位运算不精确论证成功
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWbxmV2m-1588189900825)(result.png)]
0.3*2    0.6    整数部分 : 0
0.6*2    1.2    整数部分 :  1
0.2*2    0.4    整数部分 :  0
0.4*2    0.8    整数部分 :  0
0.8*2    1.6    整数部分 :  1
0.6*2    1.2    整数部分 :  1
0.2*2    0.4    整数部分 :  0
…………
整数部分从上往下看

JS如何存储数字

一般形式 : 整数法,浮点法

JS中,存储的所有数字,都按照浮点法存放

浮点法存放的数字,叫做浮点数(float),浮点数分位单精度和双精度

JS中,使用双精度存放浮点数,IEEE 754,

存放方式

JS在计算机中。给每个数字开辟一快空间,尺寸固定为64位

在计算机中,位(bit)是最小的存储单位,简称位bit,
1 byte = 8 bit
1 KB = 1024 byte
1 GB = 102 4MB

[第一段][第二段][第三段]

第一段 : 1位,表示位号位,如果为1,是负数,如果为0,是正数

第二段 : 11位,表示指数位,这里的指数是值2位底的指数而不是10

第三段 : 52位,表示有效数字,

举例

0   0000 0000 011    1111 0000 0000 0000……

11位的二进制可以表示多个数字

1位    2   2^1
2位    4   2^2
3位    8   2^3
…………
11位  2048 2^11

相当于 : 1.1111000000 … … ∗ 2 1027 − 1023 1.1111000000…… * 2^{1027 - 1023} 1.1111000000210271023

特殊情况

  1. 指数为0,尾数为0 表示数字 0

  2. 指数为2047 ,尾数为0,表示为Infinity

Infinity : 0 1111111111 0000000000……………………=Infinity
  1. 符号为1,指数为2047,尾数为0,表示负无穷
-Infinity : 0 1111111111 0000000000……………………=-Infinity
  1. 指数为2047,尾数不为0,表示NaN
NaN : 1 11111111111 010001010000…………

一个正常的数字,指数部分最多是2046

  • 检验结果
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yWoNRnm-1588189900830)(Infinity.png)]

能表示的最大数字

0 111111111111110 111111111111…………

相当于: 1.11111111111 ∗ 2 1 023 1.11111111111* 2 ^1023 1.1111111111121023

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVEbBAQG-1588189900832)(NumberMax.png)]

能表示最大的安全数字

安全数字:从1开始到该数字,均是连续的整数,并且该数字的下一个整数是存在的.

 0  xxxxx  11111111111……

相当于 : $ 1111111111…… * 2 ^ {52} $

1111……(53个1) 2^53-1

99  10*2-1
999 10*3-1

下一位是 : 2 5 3 2^53 253 00000000000000

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值