【java】BigDecimal大数值与精确计算

一、大数值

java.math包中的两个类

  • 整数运算 BigInteger
  • 浮点数运算 BigDecimal

(1)BigInteger

代码示例:

import java.math.*;
 
public class BigInteger {
 
	public static void main(String[] args) {
		BigInteger b1 = new BigInteger("151523165") ;	// 声明BigInteger对象
		BigInteger b2 = new BigInteger("2132151321") ;	// 声明BigInteger对象
		System.out.println("加法操作:" + b2.add(b1)) ;	// 加法操作
		System.out.println("减法操作:" + b2.subtract(b1)) ;	// 减法操作
		System.out.println("乘法操作:" + b2.multiply(b1)) ;	// 乘法操作
		System.out.println("除法操作:" + b2.divide(b1)) ;	// 除法操作
		System.out.println("最大数:" + b2.max(b1)) ;	 // 求出最大数
		System.out.println("最小数:" + b2.min(b1)) ;	 // 求出最小数
		BigInteger result[] = b2.divideAndRemainder(b1) ;	// 求出余数的除法操作
		System.out.println("商是:" + result[0] + 
			";余数是:" + result[1]) ;
	}
}

(2) BigDecimal

  对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

2.1 四舍五入问题

首先,明确Math.round()并非为四舍五入

舍去位的数值小于5时,直接舍去。
舍去位的数值大于5时,进位后舍去。
当舍去位的数值等于5时,若5后面还有其他非0数值,则进位后舍去,若5后面是0时,则根据5前一位数的奇偶性来判断,奇数进位,偶数舍去。
11.556 = 11.56 ------六入
11.554 = 11.55 -----四舍
11.5551 = 11.56 -----五后有数进位
11.545 = 11.54 -----五后无数,若前位为偶数应舍去
11.555 = 11.56 -----五后无数,若前位为奇数应进位

2.2 利用BigDecimal四舍五入

错误举例:

 double d = 8.635;
 BigDecimal ds = new BigDecimal(d); 
 d = ds.setScale(2,RoundingMode.HALF_UP).doubleValue();
 System.out.println(d); //输出结果是8.63

可以看出结果不是我们期待的值

正确代码:

 double d = 8.635;
 BigDecimal ds = new BigDecimal(Double.toString(d)); 
 d = ds.setScale(2,RoundingMode.HALF_UP).doubleValue();
 System.out.println(d); //输出结果是8.64

如果需要精确计算,必须要用String 来够造BigDecimal

代码示例:

import java.math.*;

public class Test8 {
 
	public static void main(String[] args) {
		System.out.println("加法运算:" + MyMath.round(MyMath.add(1.15454,1.5484545),2)) ;
		System.out.println("减法运算:" + MyMath.round(MyMath.sub(884545,48545.9),3)) ;
		System.out.println("乘法运算:" + MyMath.round(MyMath.mul(1245.8,886.454),4)) ;
		System.out.println("除法运算:" + MyMath.div(9.345,3.333,3)) ;
		System.out.println("四舍五入:"+MyMath.round(9.675, 2));
	}
}
class MyMath{
	public static double add(double d1,double d2){		// 进行加法计算
		BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
		BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
		return b1.add(b2).doubleValue() ;
	}
	
	public static double sub(double d1,double d2){		// 进行减法计算
		BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
		BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
		return b1.subtract(b2).doubleValue() ;
	}
	
	public static double mul(double d1,double d2){		// 进行乘法计算
		BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
		BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
		return b1.multiply(b2).doubleValue() ;
	}
	
	public static double div(double d1,double d2,int len){		// 进行除法计算
		if (len < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
		BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
		BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
		return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
	}
	
	public static double round(double d,int len){	// 进行四舍五入
		if (len < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");}
		
		BigDecimal b1 = new BigDecimal(Double.toString(d)) ;
		return b1.setScale(len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值