一、什么是BigDecimal
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二、BigDecimal常用的构造函数
2.1、常用构造函数
BigDecimal(int)
BigDecimal(double)
BigDecimal(long)
BigDecimal(String)
三、BigDecimal常用的方法
3.1、常用方法
// 相加
add(BigDecimal);
// 相减
subtract(BigDecimal);
// 相乘
multiply(BigDecimal);
// 相除
divide(BigDecimal);
3.2、BigDecimal大小比较
java中对BigDecimal比较大小一般用的是bigDecimal的CompareTo方法
int a = bigdecimal.compareTo(bigdecimal2);
/*
a = -1,表示bigdemical小于bigdemical2;
a = 0,表示bigdemical等于bigdemical2;
a = 1,表示bigdemical大于bigdemical2;
*/
例如:a大于等于b
new bigdemica(a).compareTo(new bigdemical(b)) >= 0
四、BigDecimal格式化
NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制
BigDecimal对货币的百分比格式化
- 创建BigDecimal对象,进行BigDecimal的算术运算后
- 分别建立对货币和百分比格式化引用
- 利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比
// 建立货币格式化引用
NumberFormat currency = NumberFormat.getCurrencyInstance();
// 建立百分比格式化引用
NumberFormat percent = NumberFormat.getPercentInstance();
// 百分比小数点最多3位
percent.setMaximumFractionDigits(3);
// 贷款金额
BigDecimal loanAmount = new BigDecimal("15000.48");
// 利率
BigDecimal interestRate = new BigDecimal("0.008");
// 相乘
BigDecimal interest = loanAmount.multiply(interestRate);
System.out.println("贷款金额:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));
/**
* 贷款金额: ¥15,000.48
* 利率: 0.8%
* 利息: ¥120.00
*/
BigDecimal格式化保留2为小数,不足则补0
/**
* @desc 1.0~1之间的BigDecimal小数,格式化后失去前面的0,则前面直接加上0。
* 2.传入的参数等于0,则直接返回字符串"0.00"
* 3.大于1的小数,直接格式化返回字符串
* @param obj传入的小数
* @return
*/
public static String formatToNumber(BigDecimal obj) {
DecimalFormat df = new DecimalFormat("#.00");
if(obj.compareTo(BigDecimal.ZERO)==0) {
return "0.00";
}else if(obj.compareTo(BigDecimal.ZERO)>0&&obj.compareTo(new BigDecimal(1))<0){
return "0"+df.format(obj).toString();
}else {
return df.format(obj).toString();
}
}
System.out.println(formatToNumber(new BigDecimal("3.435")));
System.out.println(formatToNumber(new BigDecimal(0)));
System.out.println(formatToNumber(new BigDecimal("0.00")));
System.out.println(formatToNumber(new BigDecimal("0.001")));
System.out.println(formatToNumber(new BigDecimal("0.006")));
System.out.println(formatToNumber(new BigDecimal("0.206")));
/**
* 3.44
* 0.00
* 0.00
* 0.00
* 0.01
* 0.21
*/
五、BigDecimal总结
5.1、注意点
需要精确的小数计算时在使用BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
尽量使用参数类型为String的构造函数
BigDecimal都是不可变的(immutable)的,在进行每一次四则运算时,都会产生一个新的对象,所以在做加减乘除运算时要记得保存操作后的值