浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型,
类型 | 储存需求 | 取值范围 |
float | 4字节 | 大约±3.40282347E+38F(有效数位6~7位) |
double | 8字节 | 大约±1.79769313486231570E+308(有效位数15位) |
取值范围里的E是科学计数法。
double 表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double类型。很多情况下,float类型的精度很难满足需求。实际上,只有很少的情况下适合使用float类型,例如,需要单精度数据的库,或者需要存储大量数据。
float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点值(如,3.14)默认为double类型。当然,也可以在浮点数值后加后缀D或d(例如,3.14D)。
因为float需求4个字节,一个字节8位,所以一共是2的32次方,有32位。
最前面的正负位 0代表正 , 1代表负
float类型固定阶位8位。
所以剩下23数值位。
double需要8个字节,是2 的64次方,有64位。
正负位一样 0代表正 ,1代表负
double类型固定阶位11位,
所以剩下52数值位。所有的浮点数值计算都遵循IEEE 754规范。具体来说,用于表示溢出和出错情况的三个特殊的浮点数值:
正无穷大
负无穷大
NaN*(不是一个数字)
例如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。
精度丢失问题:
整型数值中int类型和浮点数值中float同样是4个字节,但是他们两个的取值范围却差很多;
int的取值范围是: -2147 483 648~2147 483 647(正好超过 2亿)
而float的取值范围:大约±3.40282347E+38F(有效数位6~7位)
我们知道整型数组中数值都是相等的间隔都是1;
而浮点数中数值是跳跃的是不确定的;
大概是这么个意思,画的不太严谨。
看上面的原理可以发现,浮点数中是有阶位的,后面是数值位,在整型数值中只有正负位和数值位。
两种可能引起精度丢失,
一:阶位大小不够引起的。比如一个数28888888888,用float存储时会被写成2.88888889e10;从上面我们可以看出float的阶位是8位,如果多的话阶位也会四舍五入。
二:因为float中有有效数字,所以他在有效数字后面那会四舍五入,这样就会造成精度丢失。