JavaScript 浮点数运算的精度问题

在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此。 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 。在一些特殊的数值表示中,例如金额,这样看上去有点变扭,但是至少值是正确了。然而要命的是,当浮点数做数学运算的时候,你经常会发现一些问题,举几个例子:

  ---  加法例子:

JavaScript 浮点数运算的精度问题

 ---减法例子:

JavaScript 浮点数运算的精度问题

 ---乘法例子:

JavaScript 浮点数运算的精度问题

---除法例子

JavaScript 浮点数运算的精度问题

问题的原因

JavaScript 里的数字是采用 IEEE 754 标准的 64 位双精度浮点数。该规范定义了浮点数的格式,对于64位的浮点数在内存中的表示,最高的1位是符号位,接着的11位是指数,剩下的52位为有效数字,具体:

第0位:符号位, s 表示 ,0表示正数,1表示负数;

第1位到第11位:储存指数部分, e 表示 ;

第12位到第63位:储存小数部分(即有效数字),f 表示,

    符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。 IEEE 754规定,有效数字第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字总是1.xx…xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript提供的有效数字最长为53个二进制位(64位浮点的后52位+有效数字第一位的1)。

可以这样解决精度问题:

parseFloat((数学表达式).toFixed(digits)); // toFixed() 精度参数须在 0 与20 之间 // 运行 parseFloat((1.0 - 0.9).toFixed(10)) // 结果为 0.1 parseFloat((0.3 / 0.1).toFixed(10)) // 结果为 3 parseFloat((9.7 * 100).toFixed(10)) // 结果为 970 parseFloat((2.22 + 0.1).toFixed(10)) // 结果为 2.32

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfpdg.html