前端的浮点数计算问题

165 阅读1分钟

//加
export const add = (num1, num2) => {
	var r1, r2, m, c
	try {
		r1 = num1.toString().split('.')[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = num2.toString().split('.')[1].length
	} catch (e) {
		r2 = 0
	}
	c = Math.abs(r1 - r2)
	m = Math.pow(10, Math.max(r1, r2))
	if (c > 0) {
		var cm = Math.pow(10, c)
		if (r1 > r2) {
			num1 = Number(num1.toString().replace('.', ''))
			num2 = Number(num2.toString().replace('.', '')) * cm
		} else {
			num1 = Number(num1.toString().replace('.', '')) * cm
			num2 = Number(num2.toString().replace('.', ''))
		}
	} else {
		num1 = Number(num1.toString().replace('.', ''))
		num2 = Number(num2.toString().replace('.', ''))
	}
	return (num1 + num2) / m
}

// 减
export const cut = (num1, num2) => {
	var r1, r2, m, n
	try {
		r1 = num1.toString().split('.')[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = num2.toString().split('.')[1].length
	} catch (e) {
		r2 = 0
	}
	m = Math.pow(10, Math.max(r1, r2)) //last modify by deeka //动态控制精度长度
	n = r1 >= r2 ? r1 : r2
	return ((num1 * m - num2 * m) / m).toFixed(n) - 0
}

// 乘
export const ride = (arg1, arg2) => {
	let m = 0,
		s1 = arg1.toString(),
		s2 = arg2.toString()
	try {
		m += s1.split('.')[1].length
	} catch (e) {
		// console.log(e)
	}
	try {
		m += s2.split('.')[1].length
	} catch (e) {
		// console.log(e)
	}
	return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m)
}

// 除
export const except = (arg1, arg2) => {
	let t1 = 0,
		t2 = 0,
		r1,
		r2
	try {
		t1 = arg1?.toString()?.split('.')?.[1]?.length || 0
	} catch (e) {
		console.log(e)
	}
	try {
		t2 = arg2?.toString()?.split('.')?.[1]?.length || 0
	} catch (e) {
		console.log(e)
	}

	r1 = Number(arg1.toString().replace('.', ''))

	r2 = Number(arg2.toString().replace('.', ''))
	return (r1 / r2) * Math.pow(10, t2 - t1)
}

学.动.回.养猪