如何处理让人头疼的前端数字精准度问题
前端的数字存在浮点数问题(受计算机处理精度的影响),如何去很好的解决这个难题呢?一般会采用升幂再降幂的方法。下面是重写的加减乘除方法:
// 以下是处理javascript小数精度加减乘除的四个的函数
/**
* 必需要传的前两个参数:传入两个要计算的数字
* 非必要传的最后一个参数:自己想要精确的位数
*/
const globalConst = {
MAX_PRECISION: 8
}
// 计算两位数应该乘以的数,为加减乘数服务的函数
function formatNumber(num1, num2) {
let r1, r2
try {
r1 = num1.toString().split('.')[1].length
} catch (e) {
r1 = 0
}
try {
r2 = num2.toString().split('.')[1].length
} catch (e) {
r2 = 0
}
let sum = r1 + r2
let sub = r2 - r1
return { 'max': Math.pow(10, Math.max(r1, r2)), 'sum': Math.pow(10, sum), 'sub': Math.pow(10, sub) }
}
// 加法
const plus = function (num1, num2, n) {
let formatNum = formatNumber(num1, num2).max
let result = (num1 * formatNum + num2 * formatNum) / formatNum
if (n) {
return Number(result.toFixed(n))
}
return Number(result.toFixed(globalConst.MAX_PRECISION))
}
// 减法
const subtract = function (num1, num2, n) {
let formatNum = formatNumber(num1, num2).max
let result = (num1 * formatNum - num2 * formatNum) / formatNum
if (n) {
return Number(result.toFixed(n))
}
return Number(result.toFixed(globalConst.MAX_PRECISION))
}
// 乘法
const multiply = function (num1, num2, n) {
let sum = formatNumber(num1, num2).sum
let s1 = Number(num1.toString().replace('.', ''))
let s2 = Number(num2.toString().replace('.', ''))
let result = (s1 * s2) / sum
if (n) {
return Number(result.toFixed(n))
}
return Number(result.toFixed(globalConst.MAX_PRECISION))
}
// 除法
const divide = function (num1, num2, n) {
let sub = formatNumber(num1, num2).sub
let r1 = Number(num1.toString().replace('.', ''))
let r2 = Number(num2.toString().replace('.', ''))
let result = (r1 / r2) * sub
if (n) {
return Number(result.toFixed(n))
}
return Number(result.toFixed(globalConst.MAX_PRECISION))
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 职责链模式
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论