共计 1276 个字符,预计需要花费 4 分钟才能阅读完成。
溯源
数字计算机当中是以二进制存储,所以这里咱们须要先晓得十进制转二进制的规定, 和二进制转十进制的规定
十进制转换二进制
分两种规定:
- 整数转二进制:除 2 取余,逆序排列。
- 小数转二进制:乘 2 取整,正序排列
怎么了解这两句:比方 9.375 这个数字,整数是 9,小数是 0.375
整数 9 转成二进制就是: 1001
那么小数 0.375 转成二进制就是:011
那么 9.375 转成二进制就是 1001.011
可利用上面办法验证
console.log((9.375).toString(2))
console.log(Number.prototype.toString.call(9.375,2));
console.log(Number.prototype.toString.call(Number(9.375),2));
同样二进制转十进制
- 小数点前: 从右往左用二进制的每个数乘以 2 的相应次方递增
- 小数点后: 从左往右用二进制的每个数乘以 2 的相应负次方递增
IEEE 754 双精度 64 位浮点数
十进制有个叫迷信计数法示意:
所以
0.1 的二进制
e = -4;
m = 1.1001100110011001100110011001100110011001100110011010 (52 位)
0.2 的二进制
e = -3;
m = 1.1001100110011001100110011001100110011001100110011010 (52 位)
而后咱们把它相加,这里有一个问题,就是指数不统一时,个别是往右移,因为即便左边溢出了,损失的精度远远小于左移时的溢出
所以转化后为
e = -3; m = 0.1100110011001100110011001100110011001100110011001101 (52 位)
+
e = -3; m = 1.1001100110011001100110011001100110011001100110011010 (52 位)
失去
e = -3; m = 10.0110011001100110011001100110011001100110011001100111 (52 位)
保留一位整数
e = -2; m = 1.00110011001100110011001100110011001100110011001100111 (53 位)
超过了 52 位,做四舍五入
舍入与原来的数最靠近的,准则是保留偶数最终的二进制数
1.0011001100110011001100110011001100110011001100110100 * 2 ^ -2
=0.010011001100110011001100110011001100110011001100110100
转化为十进制为0.30000000000000004
如何防止这个事件的产生
咱们认为能够了解的数,在计算机外部它反而是一个有限循环的小数,
它没有方法,它的尾数的尾数只有 52 位,它只有截断,进行规格化,进行舍入解决的时候可能就会导致一个精度的偏差,所以失去的是一个绝对精准的后果但不是相对的精准
有什么方法让 0.1+0.2 等于 0.3(0.2*100 + 0.1*100)/100
那就是防止计算的时候呈现小数位
正文完
发表至: javascript
2022-07-08