0.1+0.2 ≠ 0.3

2023-05-24 15:57:10 浏览数 (1)

JS中整数和浮点数统属于数字类型,在计算机中,所有的数字都是采用IEEE754标准的64位双精度浮点数形式存储,进而导致了无论是储存、计算中都会存在精度问题。其存储形式为: 1. 第一位是正负符号位,0: 正数 1: 负数

2. 第二至十二这十个为指数位,表示次方数

3. 剩余52位为尾数,储存小数部分,超出的部分自动进一舍零

既然位数是固定的,那么必然会处在截断,进而导致精度问题。

0.1和0.2在计算机中存储形式为:

那么两者相加

0.0100 1100 1100 1100

转为十进制:0 * 1/2 1 * 1/4 0 * 1/8 0 * 1/16 1 * 1/32 0 * 1/64 ...

最终得到为0.30000000000000004

同样的道理,不仅小数部分,乃至整数也会存在精度问题,因为整数也是数字,数字也是按照浮点数存储,正数的最大最小值为:

最大: 2的53次方 -1 ➡️ 9007199254740991

最小:- 2的53次方 -1 ➡️ -9007199254740991

所以就导致了

以上是计算时的精度问题,那么接下来看下储存时的精度问题

从上可知,toFixed时候其实是进行四舍五入,但是由于2.55在计算中存储为2.549999999...,2.45存储为2.4500000...,所以就导致了2.55.toFixed(1)➡️2.5、2.45.toFixed(1)➡️2.5

0 人点赞