【bug消除】js的加减乘除

1、bug出现

js的加减乘除都有潜在的bug。

// 加法
0.1+0.2=0.30000000000000004 
1.3+1.1=2.4000000000000004
// 减法
0.3-0.1=0.19999999999999998
1.3-1=0.30000000000000004
// 乘法
1.3*3=3.9000000000000004
5.3*9=47.699999999999996
// 除法
0.3/0.1=2.9999999999999996
0.6/3=0.19999999999999998
复制代码

最基本的运算,小学生都会,它不会,哈哈哈!

【个中缘由大家都知道--JavaScript的数字采用IEEE754标准】

详细介绍请看博文:www.css88.com/archives/73…

2、bug解决

把运算的数字全部转化为整数再处理就行了

2-1 add()
/**
 * 加法运算
 * 
 * @param {Number} a
 * @param {Number} b
 */

/* 提示:因为原生js会出现类似:
0.1+0.2=0.30000000000000004 
1.3+1.1=2.4000000000000004
的情况。所以共同乘以10的n次方,n为a、b两个数小数部分的最大长度值,这样就能一起化为整数运算
*/
const add = (a, b) => {
  if (!a || !b) {
    console.log('Error: 加法需要传入2个数字')
    return '加法需要传入2个数字'
  }
  let c = 0 // a的小数部分长度
  let d = 0 // b的小数部分长度
  try {
    c = a.toString().split('.')[1].length
  } catch (f) { }
  try {
    d = b.toString().split('.')[1].length
  } catch (f) { }
  
  let e = 10 ** Math.max(c, d) //保证a、b为整数的最小10次幂
  return (a * e + b * e) / e
}
复制代码
2-2 sub()
/**
 * 减法运算
 * 
 * @param {Number} a
 * @param {Number} b
 */

/* 提示:因为原生js会出现类似:
0.3-0.1=0.19999999999999998
1.3-1=0.30000000000000004
的情况。所以共同乘以10的n次方,n为a、b两个数小数部分的最大长度值,这样就能一起化为整数运算
*/
const sub = (a, b) => {
  if (!a || !b) {
    console.log('Error: 减法运算需要传入2个数字')
    return '减法运算需要传入2个数字'
  }
  let c = 0 // a的小数部分长度
  let d = 0 // b的小数部分长度
  try {
    c = a.toString().split('.')[1].length
  } catch (f) { }
  try {
    d = b.toString().split('.')[1].length
  } catch (f) { }

  let e = 10 ** Math.max(c, d) //保证a、b为整数的最小10次幂
  return (a * e - b * e) / e
}
复制代码
2-3 mul()
/**
 * 乘法运算
 * 
 * @param {Number} a
 * @param {Number} b
 */

/* 提示:因为原生js会出现类似:
1.3*3=3.9000000000000004
5.3*9=47.699999999999996
的情况。所以共同乘以10的n次方,n为a、b两个数小数部分的最大长度值,这样就能一起化为整数运算
*/
const mul = (a, b) => {
  if (!a || !b) {
    console.log('Error: 乘法运算需要传入2个数字')
    return '乘法运算需要传入2个数字'
  }
  let c = 0 // a的小数部分长度
  let d = 0 // b的小数部分长度
  try {
    c = a.toString().split('.')[1].length
  } catch (f) { }
  try {
    d = b.toString().split('.')[1].length
  } catch (f) { }

  return (Number(a.toString().replace('.', '')) * Number(b.toString().replace('.', ''))) / (10 ** (c + d))
}

复制代码
2-4 div()
/**
 * 除法运算
 * 
 * @param {Number} a
 * @param {Number} b
 */

/* 提示:因为原生js会出现类似:
0.3/0.1=2.9999999999999996
0.6/3=0.19999999999999998
的情况。所以共同乘以10的n次方,n为a、b两个数小数部分的最大长度值,这样就能一起化为整数运算
*/
const div = (a, b) => {
  if (!a || !b) {
    console.log('Error: 减法运算需要传入2个数字')
    return '减法运算需要传入2个数字'
  }
  let c = 0 // a的小数部分长度
  let d = 0 // b的小数部分长度
  try {
    c = a.toString().split('.')[1].length
  } catch (f) { }
  try {
    d = b.toString().split('.')[1].length
  } catch (f) { }

  const fenzi = Number(a.toString().replace('.', '')) * (10 ** (c + d))
  const fenmu = Number(b.toString().replace('.', '')) * (10 ** (c + d))
  return fenzi / fenmu / (10 ** (c - d))
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值