在学习到java这一块的时候对于float类型为什么能比int表示范围大那么多感到困惑,查了一些资料后记录下自己的学习。
不同于int类型的老老实实的存储,float类型用的指数表示法存储。
举个例子来说:
(十进制)10.625 => (二进制-老实版)1010.101 => (二进制-指数版)1.010101*2^3
float类型用1位表示整体的正负,8位表示指数,23位表示尾数
符号位(1位) | 指数位(8位) | 尾数位(23位) |
0表示正数 1表示负数 | 存储指数表示法中2的x次方中的x,实际存储为x+127 不同于平时习惯的专门拿一位来表示符号,8位可以表示0~255,127相当于0,正三就是130,负二就是125 | ...2^3,2^2,2^1,2^0,2^-1,2^-2,2^-3... 整数部分正常表示,小数部分其实是2的负次方,很多时候都是表示不尽,所以浮点型是不精确的。 小数点左边都是1,所以只要存储小数点右边即可。 |
(正数) 0 | (3+127=130) 1000 0010 | (指数表示法小数点后的二进制,不足用0补齐) 0101 0100 0000 0000 0000 000 |