基本数据类型和包装数据类型
| 基本数据类型 | 包装数据类型 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
区别
- 用途:除了定义一些常量和局部变量使用基本数据类型之外,其他的比如对象的属性很少会使用基本数据类型
- 包装类型不赋值就是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[]数组来存储任意大小的整形数据。