Java BigInteger&BigDecimallBig

本文深入探讨了Java中处理大数运算的两种主要类:BigInteger和BigDecimal。详细讲解了它们的使用场景,构造方法,以及如何进行加、减、乘、除等基本数学运算。特别强调了BigDecimal在处理浮点数运算时的精确性和四舍五入功能。

1.BigInteger

/*
 * 1.操作的数值很大,首先想到的是double
 */
System.out.println(Double.MAX_VALUE*Double.MAX_VALUE);//Infinity 因为已经超过了double的范畴;
/*
 * 如果两个数计算超过了Double的范畴需要怎么处理?
 * a.如果超过了double的范围无法使用double进行保存,只有String才可能准确的保存号这个数据;
 * b.如果数据很大的数字要进行数学计算,只能将其变为字符串类型,而后按位取出每一个字符保存的数据,进行手工的计算;相当的麻烦;
 * java考虑到了这种情况,java专门提供了大数字的操作类BigInteger,BigDecimal;
 * public class BigInteger extends Number implements Comparable<BigInteger>{}
 * BigInteger(String val){}
 * public class BigInteger extends Number implements Comparable<BigInteger>{}
 * 
 */
BigInteger b1=new BigInteger("2355555555333");
BigInteger b2=new BigInteger("1335555555533");
//加法运算
System.out.println(b1.add(b2));
//减发运算
System.out.println(b1.subtract(b2));
//乘法运算
System.out.println(b1.multiply(b2));
//除法运算 --返回的是一个BigInteger
System.out.println(b1.divide(b2));//1
//数组里面只有两个元素 第一个元素是商 ,第二个元素是余数
BigInteger[] result = b1.divideAndRemainder(b2);
System.out.println("商:"+result[0]+" 余数"+result[1]);
//java虽然提供了大数字的操作,但是在实际的项目中可能对于数字比较敏感;这时java本身提供的数字类帮助不大;
//  需要使用第三方的进行数学计算的包来实现,如果要使用java提供的数字来一定要考虑计算的结果是否准确;

2.BigDecimall

 /*BigDecimal 大浮点数  
	  * BigInteger不能保留小数,BigDecimal可以保留小数数据;
	  *  public BigDecimal(String val) {}
	  *   public BigDecimal(double val) {}//这个构造可能会产生一些问题(这个函数返回的结果有些不可预测)
	 解决方案总结:(https://blog.youkuaiyun.com/qq_34273222/article/details/79986206)
	 1.将结果转换成String类型,再使用BigDecimal(String s)构造方法
	 2.使用BigDecimal.valueOf()方法
	  *   BigDecimal不仅支持基本的数学计算,且BigDecimal可以用来准确的实现四舍五入;(
	  *    使用Math.round()可以实现四舍五入的操作,但是这种操作有一个问题,所有的小数位都四舍五入了;
	  *    比如一家公司的年收入是8.45678亿,安装Math.round()方法相当于只有8亿了;)
	  * 虽然 BigDecimal 没有提供直接的四舍五入的操作支持,但是可以利用除法运算实现;
	  *  public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {}
	  *  BigDecimal divisor:除数
	  *   int scale:保留几位小数
	  *   int roundingMode:进位模式;
	  *       public static final int ROUND_HALF_UP:四舍五入模式
	  *   可以解决浮点型数据不能精确计算的文件;
	  * */
	  
	  
	  
	 System.out.println(0.1+0.2);//0.30000000000000004
	 System.out.println(0.3-0.1);//0.19999999999999998
	 System.out.println(0.1*0.2);//0.020000000000000004
	 System.out.println(0.7/0.1);//6.999999999999999
	 // 原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示,可以使用BigDecimal解决
	  
	 //public BigDecimal(double val) {}构造函数可能发生的问题
	  BigDecimal bd1=new BigDecimal("2.4");//2.4
	  BigDecimal bd2=new BigDecimal(2);//2
	  //The results of this constructor can be somewhat unpredictable.(这个函数返回的结果有些不可预测)
	  BigDecimal bd3=new BigDecimal(2.4);//2.399999999999999911182158029987476766109466552734375
	  BigDecimal bd4=new BigDecimal(Double.toString(2.4));//2.4
	  System.out.println(bd1+"\t\n"+bd2+"\t\n"+bd3+"\t\n"+bd4);
	  
	  //在进行浮点数操作是尽量使用public BigDecimal(String val) {}
	  BigDecimal a=new BigDecimal(Double.toString(0.1));
	  BigDecimal b=new BigDecimal(Double.toString(0.2));
	  System.out.println("a+b:"+a.add(b));//加法
	  BigDecimal c=new BigDecimal(Double.toString(0.3));
	  BigDecimal d=new BigDecimal(Double.toString(0.1));
	  System.out.println("c-d:"+c.subtract(d));//减法
	  System.out.println("a*b:"+a.multiply(b));//乘法
	  System.out.println("c/d:"+c.divide(d));//除法
	  
	  //当不能整除的的时候 divide()会抛异常java.lang.ArithmeticException
	   BigDecimal e=new BigDecimal(Double.toString(0.5));
	   BigDecimal f=new BigDecimal(Double.toString(0.21));
	 System.out.println(e.divide(f));//java.lang.ArithmeticException:Non-terminating decimal expansion; no exact representable decimal result.
	 //java提供了对应的构造函数解决
	 // e.divide(divisor, scale, roundingMode); divisor: 除数 ;scale:小数点后保留位数;
	 //舍入模式:ROUND_HALF_UP 四舍五入
	 System.out.println(e.divide(f, 2, BigDecimal.ROUND_HALF_UP));

3.利用BigDecimall中的除法运算实现准确的四舍五入;

public static double round(double num,int scale) {
		 BigDecimal bd1=new BigDecimal(num);
		 BigDecimal bd2=new BigDecimal(1);
		 return  bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值