欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java BigInteger&BigDecimall,

来源: javaer 分享于  点击 10064 次 点评:287

Java BigInteger&BigDecimall,


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) {}//这个构造可能会产生一些问题(这个函数返回的结果有些不可预测)
 *   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("a-b:"+c.subtract(d));//减法
 System.out.println("a*b:"+a.multiply(b));//乘法
 System.out.println("a/b:"+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();
	 }

 

相关文章

    暂无相关文章
相关栏目:

用户点评