BigDecimal类的使用。
最近写一个接口,遇到很多的数字计算问题,参与计算的数字有int,double,String等各种类型,我们知道这种类型不同的数字在计算的时候转换时非常麻烦的,所以我想到了使用
BigDecimal这个类去转化实现计算。下面说一下这个类的基本用法。用法引用:http://www.cnblogs.com/linjiqin/p/3413894.html
0:找了很多,都没有找到在使用BigDecimal类的时候,pom文件中依赖的引入,下面分享一下
net.contargo
big-decimal-validator
1.3.0
1: 转换数字类型:
构造器转换:new BigDecimal(int类型);
new BigDecimal(long类型);
new BigDecimal(double类型);
new BigDecimal(String类型);
2: BigDecimal类中的API
add(BigDecimal bigDecimal) 相加
subtract(BigDecimal bigDecimal) 减法
multiply(BigDecimal bigDecimal) 相乘
divide(BigDecimal bigDecimal) 相除(看下文)
3: BigDecimal转换成其他类型
toString() :转为字符串
doubleValue() :转为double类型
intValue() :转为int类型
longValue() : 转为long类型
4:货币格式化
代码如下:
NumberFormat a = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
BigDecimal loanAmount = new BigDecimal(“10000.11”);
System.out.println(a.format(b));输出结果是贷款金额: ¥10,000.11
5:关于BigDecimal大小比较问题:
int result = a.compareTo(b);
当a > b的时候,result = 1;
当a = b的时候,result = 0;
当a < b的时候,result =-1;
6:BigDecimal在做除法运算时候需要注意的问题:
使用BigDecimal做除法运算的时候,有可能除完之后含有小数,也有可能是除不尽的问题,这时我们需要考虑
BigDecimal除法的精确使用。(以下伪代码中a,b都是BigDecimal的实体,位数表示 精确到小数点后几位,如果不需要小数
则位数是0)
伪代码: a.divide(b,位数,精确方式)
实列:
public void run() {
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b,1,ROUND_CEILING);
System.out.println(c);
}
输出结果是3.4
ROUND_CEILING :如果c是正数,则遵循ROUND_UP操作,c是负数,则遵循ROUND_DOWN操作
ROUND_UP :在精确的小数最后一位加 1
ROUND_DOWN :直接舍弃精确小数位数后面的内容
ROUND_HALF_DOWN :如果舍弃部分的第一位数字 > 5,则按ROUND_UP操作,否则按ROUND_DOWN操作
ROUND_HALF_UP :如果舍弃部分的第一位数字 >= 5,则按ROUND_UP操作,否则按ROUND_DOWN操作
ROUND_HALF_EVEN:如果舍弃部分左边的数字为奇数,则作ROUND_HALF_UP;如果它为偶数,则作ROUND_HALF_DO
ROUND_UNNECESSARY:必须能够整除才能使用,否则报错java.lang.ArithmeticException: Rounding necessary。