09月28, 2017

浮点数精度问题(0.1 + 0.2 ?= 0.3)

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

IEEE 754 规定了两种基本浮点格式:单精度和双精度。 IEEE单精度格式具有24 位有效数字精度(包含符号号),并总共占用32 位。IEEE双精度格式具有53 位有效数字精度(包含符号号),并总共占用64 位。

十进制0.1    => 二进制0.00011001100110011…(循环0011)     =>尾数为1.10011001100110011001100(共52位,除了小数点左边的1),
指数为-4(二进制移码为00000000010),
符号位为0    => 计算机存储为:0 00000000100 1001100110011001111001    => 因为尾数最多52位,所以实际存储的值为0.00011001100110011001100110011001100110011001100110011001    

而十进制0.2    => 二进制0.0011001100110011…(循环0011)    =>尾数为1.10011001100110011001100(共52位,除了小数点左边的1),指数为-3(二进制移码为00000000011),符号位为0    => 存储为:0 00000000011 1001100110011001111001    

因为尾数最多52位,所以实际存储的值为0.00110011001100110011001100110011001100110011001100110011
    
那么两者相加得:    0.00011001100110011001100110011001100110011001100110011001+  0.00110011001100110011001100110011001100110011001100110011    =  0.01001100110011001100110011001100110011001100110011001100    

转换成10进制之后得到:0.30000000000000004

本文链接:http://blog.wxink.xyz/post/doubleFloat.html

-- EOF --

Comments