JAVA基础之基本类型

1.8大基本数据类型:
byte (1个字节) 、 char (2个字节) 、 short(2个字节) 、 short (4个字节) 、 long (8个字节) 、 float (4个字节) 、 double (8个字节)

2.float和long类型

long 整型数,在内存中占用8个字节共64位,表示的数值有264 (-263-263)

float在内存中占4个字节,共32位,在内存中是这样的:
V=(-1)^s * M * 2^E
在这里插入图片描述
浮点数的32位不是简单的直接表示大小,而是按照一定的标准分配的.
其中第一位,符号位即S.
接下来8位,指数域,即E.
剩下的32位,小数域,即M,M的取值范围为[1,2)或[0,1).
也就是说,浮点数在内存中的二进制值不是直接转为十进制数值,而是按照上述公式计算而来,虽然只用到4个字节,但是却比长整型的最大值要大.
这也就是为什么在数据转换的时候,long类型转换为float类型的根本原因所在!

3.小数类型需要注意的地方
a.存储的小数的数值可能是模糊值

public static void main(String[] args) {
    double d1 = 0.1;
    double d2 = 0.2;
    System.out.println(d1+d2 == 0.3);
    System.out.println(d1+d2);
}

运行结果:

false
 0.30000000000000004

上述的运算结果并不是错误。这是因为无法用二进制来准确地存储的0.3,这是一个无限循环的值,与10进制的1/3很相似。不只是0.3,很多小数都是无法准确地用浮点型表示,其实这是由 小数的十进制转成二进制的算法所决定的,十进制的小数要不断乘2,知道最后的结果为整数才是最后的二进制值,但这有可能怎么也得不到整数,所以最后得到的结果可能是一个 无限值 ,浮点型就无法表示了

但是对于 整数 来说,在浮点数的有效范围内,则都是精确的。同样,也是由于转换算法:十进制的整数转成二进制的算法是不断对2求余数,所以 不会存在无限值的情况;

b.浮点数的有效位及精度

浮点型所能表示的有效位是有限的,所以哪怕是整数,只要超出有效位数,也只能存储相似值,也就是该数值的最低有效位将会丢失,从而造精度丢失。
  float类型的二进制有效位是24位,对应十进制的7 ~ 8位数字;double类型的二进制53位,对应十进制的10 ~ 11位数字。

double、float类型 所能表示的范围比int、long类型表示的范围要广,也浮点类型属于大类型。但是,并不能完美地表整形,浮点类型的精度丢失会造成一些问题。

public static void main(String[] args) {
    int a = 3000000;
    int b = 30000000;
    float f1 = a;
    float f2 = b;
    System.out.println((f1==f1+1));
    System.out.println((f2==f2+1));
    System.out.println(Integer.toBinaryString(a).length());
    System.out.println(Integer.toBinaryString(b).length());
}

运行结果:

 false
 true
 22
 25

上面的例子很好体现了精度丢失所带来的后果:30000000==30000001 的比较居然为true了。而造成这种结果的原因就是 30000000的有效二进制位数是25位,超出了float所能表示的有效位24位,最后一位就被舍去,所以就造成在刚加的1也被舍去,因此30000000的加一操作前后的浮点型表示是一样的。
  当然,并不是超出浮点型的有效位就不能精确表示,其实,主要看的是最高有效位与最低非0有效位之间的 “间隙”,如果间隙的在浮点型的有效位数内,自然可以精确表示,因为舍去的低有效位都是0,自然就无所谓了。如果上面的例子的浮点型用的是double就不会丢失精度了,因为double的精度是52位。
c.解决浮点型精度丢失的问题
  浮点型带来精度丢失的问题是很让人头痛的,所以一般情况下,在程序中是不会使用float、double来存储比较大的数据。而商业计算往往要求结果精确。float和double类型的主要设计目标是为了科学计算和工程计算
JDK为此提供了两个高精度的大数操作类给我们:BigInteger、BigDecimal。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值