java中大数据运算之BigDecimal精确运算
1. 创建BigDecimal
final BigDecimal bigDecimal = new BigDecimal(0.1); // 0.1000000000000000055511151231257827021181583404541015625
// 推荐这两种方式
final BigDecimal bigDecimal1 = new BigDecimal("0.1"); // 0.1
final BigDecimal bigDecimal2 = BigDecimal.valueOf(0.1); //0.1
2. 加减乘除
public static void main(String[] args) {
final BigDecimal numOne = new BigDecimal("0.1"); // 0.1
final BigDecimal numTwo = BigDecimal.valueOf(0.1); //0.1
final BigDecimal add = numOne.add(numTwo); // 0.2
System.out.println("add = " + add);
final BigDecimal subtract = numOne.subtract(numTwo); // 0.0
System.out.println("subtract = " + subtract);
final BigDecimal multiply = numOne.multiply(numTwo); // 0.01
System.out.println("multiply = " + multiply);
final BigDecimal divide = numOne.divide(numTwo); //1
System.out.println("divide = " + divide);
}
3. 设置小数位
public static void main(String[] args) {
final BigDecimal numOne = new BigDecimal("0.1"); // 0.1
final BigDecimal numTwo = BigDecimal.valueOf(0.1); //0.1
final BigDecimal add = numOne.add(numTwo).setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("add = " + add); // 0.20
final BigDecimal subtract = numOne.subtract(numTwo).setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("subtract = " + subtract); // 0.0
final BigDecimal multiply = numOne.multiply(numTwo).setScale(3,BigDecimal.ROUND_HALF_UP);
System.out.println("multiply = " + multiply); // 0.010
final BigDecimal divide = numOne.divide(numTwo).setScale(4,BigDecimal.ROUND_HALF_UP);
System.out.println("divide = " + divide); // 1.0000
}
4. 设置进位的方式
public static void main(String[] args) {
// 前三种方式是最常用的
// 四舍五入
System.out.println("四舍五入 1.145 = " + new BigDecimal("1.145").setScale(2,BigDecimal.ROUND_HALF_UP));
// 舍入模式,即如果为后面所有数字均为0,则舍去,如果大于0 则进1, 从不减小计算值
System.out.println("舍入模式 1.140 = " + new BigDecimal("1.140").setScale(2,BigDecimal.ROUND_UP ));
System.out.println("舍入模式 1.1401 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_UP ));
// 截断 ,从不增加计算值
System.out.println("截断模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_DOWN ));
// ROUND_FLOOR 向负无穷大方向舍入, 即向坐标轴左走
System.out.println("舍入模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_FLOOR ));
System.out.println("舍入模式 -1.141 = " + new BigDecimal("-1.141").setScale(2,BigDecimal.ROUND_FLOOR ));
// ROUND_CEILING 向负无穷大方向舍入, 即向坐标轴右走
System.out.println("舍入模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_CEILING ));
System.out.println("舍入模式 -1.141 = " + new BigDecimal("-1.141").setScale(2,BigDecimal.ROUND_CEILING ));
}
5. 两个BigDecimal 数比较
final BigDecimal bigDecimal = new BigDecimal("11.141").setScale(2, BigDecimal.ROUND_CEILING);
final BigDecimal bigDecima2 = new BigDecimal("2.141").setScale(2, BigDecimal.ROUND_CEILING);
final int i = bigDecimal.compareTo(bigDecima2);
System.out.println("i = " + i); // -1 代表前者小, 0 代表相等, 1 代表前者大

浙公网安备 33010602011771号