有关精度问题导致计算有误差的原因请看以下文章
从0.1+0.2 !== 0.3聊聊JavaScript精度问题
export class precisionCount {
constructor() {
}
// 加法
add(num1: number, num2: number) {
const l1 = String(num1).split('.')[1] ? String(num1).split('.')[1].length : 0
const l2 = String(num2).split('.')[1] ? String(num2).split('.')[1].length : 0
const pow = Math.max(l1, l2)
const base = Math.pow(10, pow)
const n1 = String(num1).padEnd(String(num1).length - l1 + pow, '0')
const n2 = String(num2).padEnd(String(num2).length - l2 + pow, '0')
return (Number(n1.replace('.', '')) + Number(n2.replace('.', ''))) / base
}
// 减法
sub(num1: number, num2: number) {
return this.add(num1, -num2)
}
// 乘法
mul(num1: number, num2: number) {
const l1 = String(num1).split('.')[1] ? String(num1).split('.')[1].length : 0
const l2 = String(num2).split('.')[1] ? String(num2).split('.')[1].length : 0
const pow = Math.max(l1, l2)
const base = Math.pow(10, pow)
return (Number(String(num1).replace('.', '')) * Number(String(num2).replace('.', ''))) / base
}
// 除法
div(num1: number, num2: number) {
const l1 = String(num1).split('.')[1] ? String(num1).split('.')[1].length : 0
const l2 = String(num2).split('.')[1] ? String(num2).split('.')[1].length : 0
const base = Math.pow(10, l2 - l1)
return (Number(String(num1).replace('.', '')) / Number(String(num2).replace('.', ''))) * base
}
// 取余
rem(num1: number, num2: number) {
const l1 = String(num1).split('.')[1] ? String(num1).split('.')[1].length : 0
const l2 = String(num2).split('.')[1] ? String(num2).split('.')[1].length : 0
const pow = Math.max(l1, l2)
const base = Math.pow(10, pow)
const n1 = String(num1).padEnd(String(num1).length - l1 + pow, '0')
const n2 = String(num2).padEnd(String(num2).length - l2 + pow, '0')
return (Number(n1.replace('.', '')) % Number(n2.replace('.', ''))) / base
}
}