简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算,一般用于商业计算。主要提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
BigDecimal的构造方法
单个参数的构造方法,主要支持传入BigInteger,Char[],String,double类型,char[]数组类似String,而BigInteger和double均需要进行转换,而String得到的确是几乎精确的值,例如new BigDecimal(“1”), 数值几乎确定为1,而没有其他精度计算等,所以一般建议使用String构造参数.
两个参数的构造方法,例如
BigDecimal(BigInteger val, MathContext mc) 将 BigInteger 转换为 BigDecimal(根据上下文设置进行舍入)。
第一个参数类似单个参数所支持的类型,第二个参数可以规定舍入规则。
其他构造参数不具体列出,可参看官网api
BigDecimal进行加减乘除运算
此处只介绍最基本的,带舍入规则的参看官网api
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
package baseJava;
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal m = new BigDecimal("6.0");
BigDecimal n = new BigDecimal("2.0");
System.out.println("m + n =" + m.add(n));
System.out.println("m - n =" + m.subtract(n));
System.out.println("m * n =" + m.multiply(n));
System.out.println("m / n =" + m.divide(n));
}
}
运行结果
从上图可以看出BigDecimal的精度计算和Java中的Integer,double等类不一样。
BigDecimal除法不能整除时报错测试
public static void errorDivide() {
BigDecimal m = new BigDecimal("6.0");
BigDecimal n = new BigDecimal("1.4");
System.out.println("m / n =" + m.divide(n));
}
如上图可以看出,当除法不可以整除时会报错,所以在使用时要注意这个。
BigDecimal设置精确到小数点第几位
如果需要对计算记过进行截断和四舍五入可用setScale方法
public static void scaleTest() {
BigDecimal m = new BigDecimal("2.888888");
BigDecimal n = new BigDecimal("1.4121212121");
System.out.println("不设置精度之前 m * n =" + m.multiply(n));
// 第一个参数是保留到多少位,第二个参数设置舍入规则
System.out.println("设置精度之后 m * n =" + m.multiply(n).setScale(3, RoundingMode.HALF_UP));
}
运行结果:
BigDecimal进行格式化
利用java.text.NumberFormat中的format方法,对BigDecimal数据格式化,得到商业计算的格式化数据。
public static void format() {
//建立货币格式化引用
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
//建立百分比格式化引用
NumberFormat percentInstance = NumberFormat.getPercentInstance();
//百分比小数点最多3位
percentInstance.setMaximumFractionDigits(3);
//金额
BigDecimal amount = new BigDecimal("9999.88");
//利率
BigDecimal interestRate = new BigDecimal("0.006");
// 利息
BigDecimal interest = amount.multiply(interestRate);
System.out.println("贷款金额:" + currencyInstance.format(amount));
System.out.println("利率:" + percentInstance.format(interestRate));
System.out.println("利息:" + currencyInstance.format(interest));
}
BigDecimal中数据的比较
public static void compare() {
BigDecimal m = new BigDecimal("6.0");
BigDecimal n = new BigDecimal("1.4");
BigDecimal l = new BigDecimal("6.0");
System.out.println("m和n的比较结果" + m.compareTo(n));
System.out.println("n和m的比较结果" + n.compareTo(m));
System.out.println("l和m的比较结果" + l.compareTo(m));
}
由运行结果可以看出1表示大于,-1表示小于,0表示相等。