float和double的精度计算

Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成:由符号位,指数位,尾数位组成。
Java中浮点数采用的是IEEE 754标准。
一个float4字节32位,分为三部分:符号位,指数位,尾数位
符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负
指数位(E):23-30位共8位为指数位,
尾数位(M):小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值,即形式为1.M或0.M,至于什么时候是 1 什么时候是 0,则由指数和尾数共同决定。
float的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38

double:符号位1位,指数位11位,尾数位52位

float指数的取值范围为-126~127,double指取的取值数范围为-1022至1023
float和double的【精度】是由【尾数的位数】来决定的,float的尾数位有23位,double的尾数位有52位

float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。

猜你喜欢

转载自blog.csdn.net/zhanglinlove/article/details/83114473