目录
为什么不用其它的类型?(比如int、long、float、double)
首先说结论,使用 BigDecimal 类。
为什么不用其它的类型?(比如int、long、float、double)
1、整型:
int、long类型不能够表示小数部分,不符合金额的实际应用。
2、浮点型:
float、double会有精度丢失,不推荐用于金额。
如下: 0.06 - 0.01 结果应该是0.05
float f1 = 0.01f;
float f2 = 0.06f;//float类型加f后缀(必须),double类型加d后缀(可无)
System.out.println(f2-f1);
double d1 = 0.01;
double d2 = 0.06;
System.out.println(d2-d1);
到这,我们已知这些基本的数据类型无法满足我们的需求,下面介绍一个类——BigDecimal
BigDecimal类
基本数据类型与BigDecimal使用时的差别:
1、创建
这是一个类,所以我们在创建时不是简单的赋值,而是需要new()对象。
(一定要注意,这里是需要用字符串 "0.01" 和字符串 "0.02" 创建,而不能用 0.01 和 0.02 创建。这是因为在使用 0.01 创建时是使用浮点数创建,浮点数的创建会产生误差,这个误差会被保存到了BigDecimal对象中。)
BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.02");
2、+ - * /
在运算时,也不能用 + - * / 等运算符,而是需要运用相对应的方法。
b2.add(b1); //b2 + b1
b2.subtract(b1); //b2 - b1
b2.multiply(b1); //b2 * b1
b2.divide(b1); //b2 / b1
3、比较
b2.compareTo(b1): 比较当前 BigDecimal 对象b1与b2的大小。
b2.equals(b1): 检查当前 BigDecimal 是否与指定的对象相等(包括标度)。
标度(Scale)
BigDecimal 有一个标度属性,表示小数点后的位数。标度的设置会影响值的精度。例如,new BigDecimal("1.2345") 的标度是4。
在进行计算时,如果没有适当设置标度,可能会导致精度损失或抛出异常(如在使用 divide() 方法时)
舍入模式
在某些操作(如除法)中,BigDecimal 需要指定舍入模式,以避免精度丢失。
常用的舍入模式包括:
进位:RoundingMode.UP ( 0.055 —> 0.06)
舍去后面的位数:RoundingMode.DOWN ( 0.055 —> 0.05)
四舍五入:RoundingMode.HALF_UP (向上,0.055 —> 0.06)
四舍五入:RoundingMode.HALF_DOWN(向下,0.055 —> 0.05)