javascript基础知识
JS 中的最大安全整数
JS中所有的数字类型存储都是双精度浮点数浮点数并不是能够精确表示范围内的所有数的, 虽然 double 浮点型的范围看上去很大: 2.23x10^(-308) ~ 1.79x10^308。 可以表示的最大整数可以很大,但能够精确表示,使用算数运算的并没有这么大。
例如下面会报错
1 | |
为什么是这个值?

- 1 位符号位
- 11 位指数位
- 52 位尾数位
使用 52 位表示一个数的整数部分,那么最大可以精确表示的数应该是 2^52 - 1 才对, 就像 64 位表示整数时那样: 2^63 - 1 (去掉 1 位符号位)。 但其实浮点数在保存数字的时候做了规格化处理,以 10 进制为例:
1 | |
对于二进制来说, 小数点前保留一位, 规格化后始终是 1.***, 节省了 1 bit,这个 1 并不需要保存。
大整数与数据库
Nodejs 越来越多的应用到后端的开发中, 不可避免的需要处理这样的溢出问题, 好在已经有很多优秀的第三方库来解决该问题:bignum、bigint。
1 | |
BIGINT 就是 64 位整数, 一旦要处理的数据量超过了 BIGINT 能存储的范围,便要考虑使用字符串保存, 坏处是数字的算数运算需要通过应用程序使用大整数库来处理,不能依赖于数据库。
注: 常常看到 BIGINT(5) 或者 INT(10), 括号里的 5 或 10 只是表示展示宽度,并不影响数的精度范围和存储字节数,需要与 VARCHAR(100)或 DECIMAL(10,2)区分开
JS右移0位
在Javascript代码有时候会看到this.length >> 0这样的类似代码,那么this.length >> 0这样的代码有什么用呢?
- >> 代表有符号右移运算符 === 算术右移
- >>> 在Javascript中代表无符号右移运算符 === 逻辑右移
移位运算分为左移和右移,其中左移运算都是丢弃最高位,在右端补零。而右移预算则分为逻辑右移>>>和算术右移动>>,逻辑右移在左端补零,算术右移则在左端扑最高有效位的值。
this.length >> 0的作用更简易的总结:
- 所有非数值转换成0
- 所有大于等于 0 数取整数部分(快速去掉小数)
例:1
2'hello' >> 0 // 0
32.5 >> 0 // 32
文章参考
延伸阅读
javascript的的最大安全数
http://example.com/2017/11/01/js-base-number/