写在前头
大多数小伙伴看技术书籍都会用“啃”来描述读书的直观感受,当然我也是一个前端小白,白的透明那种,但是我在读技术书籍感觉到“啃”的时候,我希望把我啃红宝书第四版的过程的想法,总结带给大家,以供后来者能够更快上手。
注: 本文由于作者水平原因,如有错误之处,恳请大家指正,另外随着学习的深入,体会的加深,我会不断回来更新,修改这类文章。
思维导图
脉络
这小节就是介绍了3.4数据类型中的3.4.5Number类型的整数,浮点数,舍入误差。
3.4数据类型
3.4.5Number类型
0. 整数
- 表示格式
书中原话:number类型使用IEEE 754格式表示整数和浮点数。
- 数值字面量格式
什么是字面量? 字面量:用于表达固定值的符号。
- 十进制 不用进制转换,一般默认十进制,可以直接书写。
- 八进制
①普通表示格式
第一个数字为0。后面跟八进制的数字,满8进位,超等8,去前缀0,看为十进制。 书中例子也十分详细,我还是写一下复习一下吧。
let num = 08; console.log(num); // 8 前缀0之后数字不能有8以上的数字(包括8),有则去掉前缀看做十进制数字 复制代码
②严格模式表示
原话:如果要表示八进制值,应该使用前缀 0o。 只使用0会报错。
- 十六进制
普通表示格式
不管什么模式下,十六进制都得使用0x前缀来创建。
- 数学操作
注意: 书中原话:使用八进制和十六进制格式创建的数值在所有数学操作中都被视为十进制数值。
1.浮点数
- 定义浮点数
由于存储空间问题,JavaScript总是将浮点数尽可能转换为整数。为了避免转换,成功的定义。必须有小数点,小数点红藕必须有数字,特殊情况:1.0 这种依然会被转换为整数。
- 内存空间
浮点数的存储空间是整数的2倍。
- 科学记数法
高中就学过了
let num1 = 980000; let num2 = 9.8e5; console.log(num1 == num2); // true 复制代码
注意: e和E均可以。
- 算术计算
浮点数精度是17位,多个浮点数相加可能会存在计算偏差。
2. 舍入误差(补充知识)
- IEEE 二进制浮点数算术标准
定义:。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值((无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;
指明:它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。
- 双精度浮点数
双精度浮点数使用 64 个比特存储。
符号位:1个比特存储。 用于表示正负符号。符号位正浮点数使用 0 表示,负浮点数使用 1 表示。
指数位:11个比特存储。
尾数位:52 个比特存储。
这三个位构成一个双精度浮点数。
- 十进制小数转为二进制小数
①基本转换
十进制小数不断乘2,取整。直到小数位为0。
②转换有限二进制条件
有些十进制小数不能转为有限位数的二进制小数。所有小数部分不是 2^-n (n 为整数)的十进制小数都不能转为有限的二进制小数。
- 常量 Number.EPSILON
验证两个浮点数的相等性
let num1 = 980000; let num2 = 9.8e5; if (num1-num2 < Number.EPSILON) { console.log('两个浮点数的相等'); } 复制代码
- JavaScript 里关于数字的运算
①误差由来
JavaScript 里关于数字的运算,都是先转为二进制,再转成二进制的科学计数法进行存储,再取出存 储值转为二级制,最后进行运算。而在先存储再取出值的过程中,就可能丢失精度。
②0.1与0.2相加
0.1+0.2 不等于 0.3这个问题很经典。
误差原因就是上面说的,0.1和0.2在转换为二进制小数的时候,这两个数字的第 51 位被进位而 填入了 1,因此这两个数字都比原本不进位的数字大。然后相加自然就比0.3大了。具体细节可以自己查一下。就不插链接了。