前端小数的精度问题
0.1 + 0.2 !== 0.3
前言:因为历史的遗留问题,前端对浮点型数据的处理一直不是很精确,因此需要通过一些方法进行处理
可以新建一个utils目录下新建.js的文件
- 多个数据的累加操作,传递一个数组即可
// 小数相加精度计算 arr: [1.11, 2.333, 4.2333],需要多个值累计的操作,调用的时候传递进去一个数组。
// 原理:对数据进行遍历统一先乘以一个较大的整数进行累加,完成后对得到的数据进行除即可解决
export const decimal_NUM = (arr) => {
let initial = 0
arr.forEach(c => {
c = Number(c) * 100000000
initial = initial + Number(c)
})
return initial / 100000000
}
- 小数相减的处理,传递两个参数即可
// 小数相减 5.9 - 3.1
export const Number_SubAll = (arg1, arg2) => {
var re1, re2, m, n
try {
re1 = arg1.toString().split('.')[1].length
} catch (e) {
re1 = 0
}
try {
re2 = arg2.toString().split('.')[1].length
} catch (e) {
re2 = 0
}
m = Math.pow(10, Math.max(re1, re2))
n = (re1 >= re2) ? re1 : re2
return ((arg1 * m - arg2 * m) / m).toFixed(n)
}
- 小数相除保留小数点位数,传递三个参数
// 除数,被除数, 保留的小数点后的位数
export const Number_DIV = (arg1, arg2, digit) => {
let t1 = 0
let t2 = 0
let r1 = null
let r2 = null
try { t1 = arg1.toString().split('.')[1].length } catch (e) { e }
try { t2 = arg2.toString().split('.')[1].length } catch (e) { e }
r1 = Number(arg1.toString().replace('.', ''))
r2 = Number(arg2.toString().replace('.', ''))
const result = ((r1 / r2) * Math.pow(10, t2 - t1)).toString()
let result2 = result.split('.')[1]
result2 = result2.substring(0, digit > result2.length ? result2.length : digit)
return Number(result.split('.')[0] + '.' + result2)
}
- 小数除法,不保留小数点位数,传递两个数据
// 除数,被除数, 保留的小数点后的位数
export const Number_Div = (data1, data2) => {
let t1 = 0
let t2 = 0
let r1 = null
let r2 = null
// 获取每个参数的小数的位数
try { t1 = data1.toString().split('.')[1].length } catch (e) { e }
try { t2 = data2.toString().split('.')[1].length } catch (e) { e }
// 把所有参数的小数点去掉转为整数
r1 = Number(data1.toString().replace('.', ''))
r2 = Number(data2.toString().replace('.', ''))
return (r1 / r2) * Math.pow(10, t2 - t1)
}
// 如果想控制小数点的位数可以通过.toFixed(数位)进行处理
// let numbers = Number_Div(除数, 被除数).toFixed(保留小数位数)
- 小数相乘,传递两个参数
// 小数相乘
export const Number_Mul = (arg1, arg2) => {
var m = 0
var s1 = arg1.toString()
var s2 = arg2.toString()
try {
m += s1.split('.')[1].length
} catch (e) { e }
try {
m += s2.split('.')[1].length
} catch (e) { e }
return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}