解决js计算丢失精度问题

488 阅读1分钟
// 加法运算
function floatAdd (arg1, arg2) {
    let r1, r2, m
    try { r1 = arg1.toString().split('.')[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split('.')[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return Number((arg1 * m + arg2 * m) / m)
}
// 减法运算
function floatSub (arg1, arg2) {
    let r1, r2, m, n
    try { r1 = arg1.toString().split('.')[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split('.')[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    // 动态控制精度长度
    n = (r1 >= r2) ? r1 : r2
    return Number(((arg1 * m - arg2 * m) / m).toFixed(n))
}
// 乘法运算
function floatMul (arg1, arg2) {
    let m = 0
    let s1 = arg1.toString()
    let s2 = arg2.toString()
    try { m += s1.split('.')[1].length } catch (e) {}
    try { m += s2.split('.')[1].length } catch (e) {}
    return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
// 除法运算
function floatp (arg1, arg2) {
    let t1 = 0
    let t2 = 0
    let r1, r2, n
    try { t1 = arg1.toString().split('.')[1].length } catch (e) {}
    try { t2 = arg2.toString().split('.')[1].length } catch (e) {}
    r1 = Number(arg1.toString().replace('.', ''))
    r2 = Number(arg2.toString().replace('.', ''))
    // 动态控制精度长度
    n = (t1 >= t2) ? t1 : t2
    return Number(Number((r1 / r2) * Math.pow(10, t2 - t1)).toFixed(n))
}

语法:

Number.toFixed(num)

toFixed() 方法可把 Number四舍五入为指定小数位数的数字。

Number:使用toFixed()方法的必须是数值类型,否则会报错

num :必需。规定小数的位数,是 0 ~ 20 之间的值,包括 020,
有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替

Math.pow()  函数返回基数(base)的指数(exponent`)次幂

Math.pow(102)  // 100

Math.max()

动态控制小数点函数

` Math.max()  ` 函数返回一组数中的最大值。

摘录自blog.csdn.net/qq_35184296…