Java开发,解决商业运算上丢失精度的问题

1. 概述

金融领域无法接受有误差的计算,必须要非常精确。Java基本数据类型中的数值型无法满足这个领域的需求。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

2. BigDecimal加减乘除基本入门使用

int i1 = 5;
int i2 = 3;
BigDecimal n1 = new BigDecimal(i1);
BigDecimal n2 = new BigDecimal(i2);
// 加 n1 + n2
BigDecimal add = n1.add(n2);
// n1 + n2 = 8
System.out.println("n1 + n2 = " + add);
// 减 n1 - n2
BigDecimal subtract = n1.subtract(n2);
// n1 - n2 = 2
System.out.println("n1 - n2 = " + subtract);
// 乘 n1 * n2
BigDecimal multiply = n1.multiply(n2);
// n1 * n2 = 15
System.out.println("n1 * n2 = " + multiply);
// 除法一定要设置精确几位小数,否则除不尽时会抛出异常
// 除 n1 / n2
/*BigDecimal divide = n1.divide(n2);
// n1 / n2 = 1.666....
System.out.println("n1 / n2 = " + divide);*/
// 保留一位小数,四舍五入
BigDecimal d1 = n1.divide(n2, 1, BigDecimal.ROUND_HALF_UP);
// n1 / n2 = 1.7
System.out.println("n1 / n2 = " + d1);
// 保留一位小数,五舍六入
BigDecimal d2 = n1.divide(n2, 1, BigDecimal.ROUND_HALF_DOWN);
// n1 / n2 = 1.7
System.out.println("n1 / n2 = " + d2);
// 保留一位小数,直接进位
BigDecimal d3 = n1.divide(n2, 1, BigDecimal.ROUND_UP);
// n1 / n2 = 1.7
System.out.println("n1 / n2 = " + d2);
// 保留一位小数,多余的小数直接忽略
BigDecimal d4 = n1.divide(n2, 1, BigDecimal.ROUND_DOWN);
// n1 / n2 = 1.6
System.out.println("n1 / n2 = " + d4);

3. BigDecimal能够链式编程

// 实现 (1 + 2) x 3 = 9的计算
int i1 = 1;
int i2 = 2;
int i3 = 3;
BigDecimal n1 = new BigDecimal(i1);
BigDecimal n2 = new BigDecimal(i2);
BigDecimal n3 = new BigDecimal(i3);
BigDecimal m1 = n1.add(n2).multiply(n3);
// (1 + 2) x 3 = 9
System.out.println("(1 + 2) x 3 = " + m1);
// 优先级高的用括号,这样就不用考虑运算规则
BigDecimal m2 = (n1.add(n2)).multiply(n3);
// (1 + 2) x 3 = 9
System.out.println("(1 + 2) x 3 = " + m2);

开发时建议根据业务计算规则先后链式编程,逻辑才不容易乱

4. BigDecimal保留小数位使用方法

// 实现 (2 + 2) / 3
int i1 = 2;
int i2 = 2;
int i3 = 3;
BigDecimal n1 = new BigDecimal(i1);
BigDecimal n2 = new BigDecimal(i2);
BigDecimal n3 = new BigDecimal(i3);
BigDecimal d1 = n1.add(n2).divide(n3, 7, BigDecimal.ROUND_HALF_UP);
// (2 + 2) / 3 = 1.3333333
System.out.println("(2 + 2) / 3 = " + d1);
// 最终结果想保留2位小数
BigDecimal s = d1.setScale(2, BigDecimal.ROUND_HALF_UP);
// (2 + 2) / 3 = 1.33
System.out.println("(2 + 2) / 3 = " + s);

小结:开发中涉及到钱的时候,需要用到BigDecimal类进行计算。在此做下开发复盘技术笔记。

猜你喜欢

转载自blog.csdn.net/rulaixiong/article/details/128280362