推荐导航
一.BigDecimal概述
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二.常用的初始化构造
- BigDecimal(int)创建一个具有参数所指定整数值的对象
- BigDecimal(double) 创建一个具有参数所指定双精度值的对象
- BigDecimal(long) 创建一个具有参数所指定长整数值的对象
- BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象
三.使用易出错点
- 场景
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal(0.1);
System.out.println(bigDecimal);
BigDecimal bigDecimal2 = new BigDecimal(0.1);
System.out.println(bigDecimal2);
}
//结果
/**
0.1000000000000000055511151231257827021181583404541015625
0.1
*/
- 原因
- 参数类型为double的构造方法的结果有一定的不可预知性,这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)
- 建议使用
BigDecimal(String)
构造器,能够准确表达0.1
- 先使用Double.toString(double) 将dubbo转换成string在使用
BigDecimal(String)
构造器
四.常用方法
除法
divide
第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式。
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)
BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2
BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3
BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4
BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3
后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
BigDecimal.ROUND_FLOOR
朝负无穷方向round 如果为正数,行为和round_down一样,如果为负数,行为和round_up一样