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))
}
复制代码