一、浮点数的本质:二进制近似
在Java中,float
(单精度32位)和double
(双精度64位)类型均采用IEEE 754标准的浮点数表示方式。这种设计虽然能高效表示极大或极小的数值,但本质上是二进制分数的近似值,这导致某些十进制小数无法精确表示。
示例:十进制的0.1 ≠ 二进制的0.1
十进制数0.1
在二进制中是无限循环小数:
0.1 (十进制) = 0.00011001100110011... (二进制)
由于浮点数尾数位数有限(float仅23位,double有52位),必须进行截断舍入,造成精度丢失。
二、IEEE 754的存储结构
以double
类型为例,其64位分为:
-
符号位(1位):0正1负
-
指数位(11位)