JS计算0.1+0.2≠0.3解法

  • 内容
  • 评论
  • 相关

学习JS,在做测试时候发现问题

jserror1

 

js中的数字都是用浮点数表示的,并规定使用IEEE 754 标准的双精度浮点数表示。

IEEE 754 规定了两种基本浮点格式:单精度和双精度。

IEEE单精度格式具有24 位有效数字精度(包含符号号),并总共占用32 位。

IEEE双精度格式具有53 位有效数字精度(包含符号号),并总共占用64 位。
十进制0.1
=> 二进制0.00011001100110011…(循环0011)
=>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-4(二进制移码为00000000010),符号位为0
=> 计算机存储为:0 00000000100 10011001100110011…11001
=> 因为尾数最多52位,所以实际存储的值为0.00011001100110011001100110011001100110011001100110011001
而十进制0.2
=> 二进制0.0011001100110011…(循环0011)
=>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-3(二进制移码为00000000011),符号位为0
=> 存储为:0 00000000011 10011001100110011…11001
因为尾数最多52位,所以实际存储的值为0.00110011001100110011001100110011001100110011001100110011
那么两者相加得:
0.00011001100110011001100110011001100110011001100110011001
+ 0.00110011001100110011001100110011001100110011001100110011
= 0.01001100110011001100110011001100110011001100110011001100
转换成10进制之后得到:0.30000000000000004