0.1+0.2为什么等于0.30000000000000004,如何通过代码解决这个问题?

705 阅读1分钟

背景:

工作中,有碰到此类的加法运算,在开始没注意到这个问题原因的时候,真的是想不透后面的那么多个零是哪里来的.

分析其原因:

  • 不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此;
  • 在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储的;
  • 双精度的浮点数在这64位上划分为3段,而这3段也就确定了一个浮点数的值,64bit的划分是“1-11-52”的模式,具体来说:
    • 1.就是1位最高位(最左边那一位)表示符号位,0表示正,1表示负;
    • 2.11位表示指数部分;
    • 3.52位表示尾数部分,也就是有效域部分

看不怎么明白,但是能理解的是,这个javascript的存储方式.

下面通过一个函数来解决这类浮点数相加的问题:

function add() {
    const args = [...arguments]
    const maxLen = Math.max.apply(
    null,
    args.map(item => {
    const str = String(item).split('.')[1]
    return str ? str.length : 0
    })
    )
    return (
    args.reduce((sum, cur) => sum + cur * 10 ** maxLen, 0) / 10 ** maxLen
    )
  }

总结: 在js中总会碰到很多异常情况,要根据不同情况进行分析具体状况,但是最终都脱离不开js的基础,多了解一些js的开发基础,以后的开发的时候填坑的速度也就会更快一些

原谅链接: 0.1+0.2为什么等于0.30000000000000004,如何通过代码解决这个问题?