**
BigDecimal的加减乘除使用方法
**
这边说下BigDecimal的使用方法,尤其是除法对小数的处理,BigDecimal在这方面做的比较出色。
import java.math.BigDecimal;
/**
* @author XXXXXX
* @description BigDecimal的使用
* @date 2019/5/21
*/
public class TestBigDecimal {
public static void main(String[] args) {
//数字初始化
BigDecimal num_a = new BigDecimal(0.00333);
BigDecimal num_b = new BigDecimal(3210000);
BigDecimal num_c = new BigDecimal(-3210000);
//字符串初始化
BigDecimal num_s_a = new BigDecimal("0.00222");
BigDecimal num_s_b = new BigDecimal("3210000");
BigDecimal num_s_c = new BigDecimal("-3210000");
//加法
BigDecimal result_1 = num_a.add(num_b);
BigDecimal result_s_1 = num_s_a.add(num_s_b);
//减法
BigDecimal result2 = num_a.subtract(num_b);
BigDecimal result_s_2 = num_s_a.subtract(num_s_b);
//乘法
BigDecimal result3 = num_a.multiply(num_b);
BigDecimal result_s_3 = num_s_a.multiply(num_s_b);
//绝对值
BigDecimal result4 = num_c.abs();
BigDecimal result_s_4 = num_s_c.abs();
//除法
BigDecimal result5 = num_b.divide(num_a,5,BigDecimal.ROUND_HALF_UP);
BigDecimal result_s_5 = num_s_c.divide(num_s_a,5,BigDecimal.ROUND_HALF_UP);
System.out.println("加法用value结果:"+result_1);
System.out.println("加法用string结果:"+result_s_1);
System.out.println("减法value结果:"+result2);
System.out.println("减法用string结果:"+result_s_2);
System.out.println("乘法用value结果:"+result3);
System.out.println("乘法用string结果:"+result_s_3);
System.out.println("绝对值用value结果:"+result4);
System.out.println("绝对值用string结果:"+result_s_4);
System.out.println("除法用value结果:"+result5);
System.out.println("除法用string结果:"+result_s_5);
System.out.println("-------------华丽的分割线-------------");
//除法舍入模式
BigDecimal test_a = new BigDecimal("2");
BigDecimal test_b = new BigDecimal("3");
BigDecimal ROUND_UP = test_a.divide(test_b,5,BigDecimal.ROUND_UP);
BigDecimal ROUND_DOWN = test_a.divide(test_b,5,BigDecimal.ROUND_DOWN);
BigDecimal ROUND_CEILING = test_a.divide(test_b,5,BigDecimal.ROUND_CEILING);
BigDecimal ROUND_FLOOR = test_a.divide(test_b,5,BigDecimal.ROUND_FLOOR);
BigDecimal ROUND_HALF_UP = test_a.divide(test_b,5,BigDecimal.ROUND_HALF_UP);
BigDecimal ROUND_HALF_DOWN = test_a.divide(test_b,5,BigDecimal.ROUND_HALF_DOWN);
BigDecimal ROUND_HALF_EVEN = test_a.divide(test_b,5,BigDecimal.ROUND_HALF_EVEN);
// BigDecimal ROUND_UNNECESSARY = test_a.divide(test_b,5,BigDecimal.ROUND_UNNECESSARY);
//计算2÷3的结果(最后一种ROUND_UNNECESSARY在结果为无限小数的情况下会报错)
System.out.println("除法---ROUND_UP---结果:"+ROUND_UP);
System.out.println("除法---ROUND_DOWN---结果:"+ROUND_DOWN);
System.out.println("除法---ROUND_CEILING---结果:"+ROUND_CEILING);
System.out.println("除法---ROUND_FLOOR---结果:"+ROUND_FLOOR);
System.out.println("除法---ROUND_HALF_UP---结果:"+ROUND_HALF_UP);
System.out.println("除法---ROUND_HALF_DOWN---结果:"+ROUND_HALF_DOWN);
System.out.println("除法---ROUND_HALF_EVEN---结果:"+ROUND_HALF_EVEN);
// System.out.println("除法---ROUND_UNNECESSARY---结果:"+ROUND_UNNECESSARY);
}
}
代码的输出:
加法用value结果:3210000.0033300000000000000606459327201491760206408798694610595703125
加法用string结果:3210000.00222
减法value结果:-3209999.9966699999999999999393540672798508239793591201305389404296875
减法用string结果:-3209999.99778
乘法用value结果:10689.3000000000001946734440316788550262572243809700012207031250000
乘法用string结果:7126.20000
绝对值用value结果:3210000
绝对值用string结果:3210000
除法用value结果:963963963.96396
除法用string结果:-1445945945.94595
-------------华丽的分割线-------------
除法---ROUND_UP---结果:0.66667
除法---ROUND_DOWN---结果:0.66666
除法---ROUND_CEILING---结果:0.66667
除法---ROUND_FLOOR---结果:0.66666
除法---ROUND_HALF_UP---结果:0.66667
除法---ROUND_HALF_DOWN---结果:0.66667
除法---ROUND_HALF_EVEN---结果:0.66667
其中,除法divide()参数使用:
使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
divide函数配置的参数如下:
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
里面八中舍入模式:
1、ROUND_UP 舍入远离零的舍入模式
2、ROUND_DOWN 接近零的舍入模式
3、ROUND_CEILING 接近正无穷大的舍入模式
4、ROUND_FLOOR 接近负无穷大的舍入模式
5、ROUND_HALF_UP 四舍五入
6、ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式
7、ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
8、ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入
具体说明参考:http://www.bdqn.cn/news/201311/11834.shtml