浮点类型用于表示有小数部分的数值。在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)。

JAVA如何表示浮点数 java中的浮点数_浮点


因为float需求4个字节,一个字节8位,所以一共是2的32次方,有32位。

最前面的正负位 0代表正 , 1代表负

float类型固定阶位8位。

所以剩下23数值位。

JAVA如何表示浮点数 java中的浮点数_取值范围_02


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;

而浮点数中数值是跳跃的是不确定的;

JAVA如何表示浮点数 java中的浮点数_萌新_03


大概是这么个意思,画的不太严谨。

看上面的原理可以发现,浮点数中是有阶位的,后面是数值位,在整型数值中只有正负位和数值位。

两种可能引起精度丢失,

一:阶位大小不够引起的。比如一个数28888888888,用float存储时会被写成2.88888889e10;从上面我们可以看出float的阶位是8位,如果多的话阶位也会四舍五入。

二:因为float中有有效数字,所以他在有效数字后面那会四舍五入,这样就会造成精度丢失。