js 保留两位小数,双精度处理

64 阅读1分钟

啰哩吧嗦

  • 关于js双精度的问题,估计大家听到见到最多的就是 0.1+0.2 != 0.3

  • 至于为什么 0.1+0.2 != 0.3,在本文不做阐述,有兴趣的可以自己查阅资料

场景

  • 接口返回我一个小于1的两个精度数字,(0.44,0.86....)

  • 页面需要展示(1-0.44)*100的值, (1-0.86)*100的值

BUG

  • 当接口返回 0.86 时,页面渲染结果为 14.000000000000002

  • 当接口返回 0.34 时,页面渲染结果为 65.99999999999999

解决

1、使用 toFixed(2)解决,但是解决之后值为 String 类型 ,但是项目中需要使用 Number类型

2、写一个函数处理

handleNumber(val) {
    let nVal = (1 - val).toFixed(2) * 100
    const sVal = nVal.toString()

    if (!sVal.includes('.')) return nVal

    nVal = +sVal.split('.')[0]
    if (sVal.split('.')[1].startsWith('9')) {
        nVal = nVal + 1
    }

    return nVal
},