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

99 阅读2分钟

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

基本数据类型包装数据类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

区别

  • 用途:除了定义一些常量和局部变量使用基本数据类型之外,其他的比如对象的属性很少会使用基本数据类型
  • 包装类型不赋值就是null,基本数据类型有默认值且不为null
  • 比较方式:包装数据类型值之间的比较全部实用equals()方法

包装数据类型缓存机制

java的数据类型使用缓存机制来提升性能,Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False

为什么浮点数运算的时候会有精度丢失的风险

这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。

如何解决浮点数的精度丢失问题?

通常使用==BigDecimal==实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到==钱的场景==)都是通过 BigDecimal 来做的。

创建方式:

  • 构造方法BigDecimal(String val)
  • BigDecimal.valueOf(double val)

加减乘除运算:

  • 加法:add
  • 减法:substract
  • 乘法:multiply
  • 除法:divide

除法保留规则

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.add(b));// 1.9
System.out.println(a.subtract(b));// 0.1
System.out.println(a.multiply(b));// 0.90
System.out.println(a.divide(b));// 无法除尽,抛出 ArithmeticException 异常
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));// 1.11

保留规则
1、保留小数位填写Integer类型
2、结果处理(四舍五入、向上取整、向下取整等)通过RoundingMode中枚举来实现,常用的:
RoundingMode.UP:直接进位,比如1.22222如果保留1位小数,得到的就是1.3
RoundingMode.DOWN:直接省略多余的小数,比如1.28888如果保留1位小数,得到的就是1.2
RoundingMode.FLOOR:向下取整,2.35保留1位,变成2.3
RoundingMode.HALF_UP:四舍五入(舍入远离零的舍入模式),2.35保留1位,变成2.4
RoundingMode.HALF_DOWN:四舍五入(接近零的舍入模式),2.35保留1位,变成2.3
借鉴:https://blog.csdn.net/yuanlaijike/article/details/89974281

大小比较

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

BigDecimal使用equals()和compareTo()的区别在于equals()会比较精度的值,compareTo()会忽略进行进行比较


超过long型的数据可以使用BigInteger来表示,BigInter内部使用int[]数组来存储任意大小的整形数据。