详解 Java 的八种基本数据类型和BigDecimal 您所在的位置:网站首页 bigdecimal和long精度 详解 Java 的八种基本数据类型和BigDecimal

详解 Java 的八种基本数据类型和BigDecimal

2023-09-17 21:07| 来源: 网络整理| 查看: 265

目录 基本数据类型8 种基本数据类型八种基本数据类型所占字节 包装类型八种基本数据类型对应的包装类型基本数据类型和包装类型转换8 种基本类型的包装类和常量池 BigDecimal

基本数据类型 8 种基本数据类型

分别为:

6 种数字类型 :byte、short、int、long、float、double1 种字符类型:char1 种布尔型:boolean

 

八种基本数据类型所占字节 基本类型位(bit)字节(Byte)默认值boolean1falsebyte810char162‘u0000’short1620int3240long6480Lfloat3240fdouble6480d

  3. 基本和字符串相互转换的方法

以整形为例

3.1. 整型转化为字符串

String str = String.valueOf(int i); String str = Integer.toString(int i); String str = “ ” + i ;

3.2. 将字符串转化为整型

int i = Integer.parseIn(String str) int i = Integer.valueOf().intValue() //说明: //Integer.parseIn和Integer.valueOf 不同, //前者生成的是整型,而后者是一个对象,所以要通过intValue()来获得对象的值

   

包装类型 八种基本数据类型对应的包装类型

boolean -> Boolean byte -> Byte char -> Character short -> Short int -> Integer long -> Long float -> Float double -> Double

 

基本数据类型和包装类型转换

 

1. 基本数据类型向包装类型转换(装箱)  

Integer a = new Integer (1); Integer b = 1;//jdk1.5 之后可以通过这种方式自动装箱 Integer c = Integer.valueOf(1);

  2. 包装类型向基本数据类型转换(拆箱)  

int a1 = a.intValue(); int b1 = b;//自动拆箱 Double c1; double c2= double(c1);//通过强制转换

 

8 种基本类型的包装类和常量池

Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean 直接返回True Or False。如果超出对应范围仍然会去创建新的对象。

两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

Integer i1 = 33; Integer i2 = 33; System.out.println(i1 == i2);// 输出 true Integer i11 = 333; Integer i22 = 333; System.out.println(i11 == i22);// 输出 false Double i3 = 1.2; Double i4 = 1.2; System.out.println(i3 == i4);// 输出 false

  应用场景:

Integer i1=40;Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。Integer i1 = new Integer(40);这种情况下会创建新的对象。 Integer i1 = 40; Integer i2 = new Integer(40); System.out.println(i1==i2);//输出 false

  再举一个更难一些的例子:

Integer i1 = 40; Integer i2 = 40; Integer i3 = 0; Integer i4 = new Integer(40); Integer i5 = new Integer(40); Integer i6 = new Integer(0); System.out.println("i1=i2 " + (i1 == i2)); System.out.println("i1=i2+i3 " + (i1 == i2 + i3)); System.out.println("i1=i4 " + (i1 == i4)); System.out.println("i4=i5 " + (i4 == i5)); System.out.println("i4=i5+i6 " + (i4 == i5 + i6)); System.out.println("40=i5+i6 " + (40 == i5 + i6));

输出:

i1=i2 true i1=i2+i3 true i1=i4 false i4=i5 false i4=i5+i6 true 40=i5+i6 true

解释:

语句 i4 == i5 + i6,因为+这个操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40。然后 Integer 对象无法与数值进行直接比较,所以 i4 自动拆箱转为 int 值 40,最终这条语句转为 40 == 40 进行数值比较。

   

BigDecimal

《阿里巴巴Java开发手册》中提到:在浮点数之间进行等值判断时,浮点数的基本数据类型(float、double)不能用==来比较,浮点数的包装数据类型(Float、Double)不能用 equals 来判断。 请看下面的例子:

float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; System.out.println(a);// 0.100000024 System.out.println(b);// 0.099999964 System.out.println(a == b);// false

具有基本数学知识的我们很清楚的知道输出并不是我们想要的结果(精度丢失),我们如何解决这个问题呢?

一种很常用的方法是:使用使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。

BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); BigDecimal c = new BigDecimal("0.8"); BigDecimal x = a.subtract(b); //两数相减 BigDecimal y = b.subtract(c); System.out.println(x); /* 0.1 */ System.out.println(y); /* 0.1 */ System.out.println(Objects.equals(x, y)); /* true */

 

BigDecimal 的大小比较

a.compareTo(b) : 返回 -1 表示 a 小于 b,0 表示 a 等于 b , 1表示 a 大于 b

BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); System.out.println(a.compareTo(b));// 1

 

BigDecimal 保留几位小数

通过 setScale方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。

BigDecimal m = new BigDecimal("1.255433"); BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN); System.out.println(n);// 1.255

  注意

我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 BigDecimal(String) 构造方法来创建对象。BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有