浮点数四则运算

项目地址:github.com/wangxiaofei…

为何浮点数运算时会失精

计算机运算时二进制的,而有些浮点数转换成二进制的时候是无限循环的,eg: 0.1

0.1 * 2 = 0.2 # 0
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
.....
复制代码

但计算机内存有限,我们不能用储存所有的小数位数,达到某个精度点会直接舍弃;有些误差可以相互抵消,但是有些就会相互叠加,这就造成了0.1+0.2!=0.3

怎么做

浮点数拆分成
1.12 => {left: 1, right: 12, length: 2}
1.1 => {left: 1, right: 1, length: 1}
-1.12 => {left: -1, right: -12, length: 2}
复制代码
两个数小数位位数同步
1.12 => {left: 1, right: 12, length: 2}
1.1 => {left: 1, right: 10, length: 2}
复制代码
运算
  1. 加法
  • 整数部分相加
  • 小数部分相加
  • 判断是否需要进位或者退位(如果小数位相加后的大小大于他们的位数即需要进位)
  • parseFloat
  1. 乘法
  • (l1 + r1) * (l2 + r2) = l1l2 + l1r2 + r1l2 + r1r2
  • 对四部分进行因为运算,比如r1*r2 = 10 * 12 = 120 = 0.012 --> 因为两位小数和两位小数相乘后得到的数是四位小数
  • 对四部分进行相加操作

为何没有除法

除法本身就有除不尽的时候

为何不直接把浮点数直接移位成整数,再运算,在移位回去

这样做后方法可计算的范围将大大变小,比如: 假如系统最大运算的数字是整数部分32位,小数部分32位,在这种前提下做加法运算的位数将缩小一半,最大能支持的是小数和整数部分一起是32位的数字。

转载于:https://juejin.im/post/5bf259b5f265da61461dc462

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值