您的位置:首页 > 编程语言 > Java开发

java.math包中的BigInteger和BigDecimal

2016-10-03 10:14 288 查看
    有时可能碰到需要计算非常大的数,它可能已经超出了Long,Double的范围,如66666666666666*666666666666666,这时就需要进行大数操作。

    在java.math这个包中有两个进行大数操作的类:java.math.BigInteger和java.math.BigDecimal,前者进行整数的大数操作,后者进行小数的大数操作。

    在这里对这两个类进行简单的介绍,来看看下面的实例:

    首先是BigInteger:

    import java.math.BigInteger;

    public class TestBigInteger {
public static void main(String[] args){
String num1 = "3435345346346343543545";
String num2 = "423413534634643634643";
BigInteger b1 = new BigInteger(num1);
BigInteger b2 = new BigInteger(num2);

System.out.println("加法操作: "+b1.add(b2));
System.out.println("减法操作: "+b1.subtract(b2));
System.out.println("乘法操作: "+b1.multiply(b2));
System.out.println("除法操作: "+b1.divide(b2));

BigInteger[] b = b1.divideAndRemainder(b2); //返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
System.out.println("b1/b2后的结果: "+b[0]);
System.out.println("b1%b2后的结果: "+b[1]);
}

    }

    BigInteger的构造方法public BigInteger(String val)是 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。同样,大整数操作可以像其它类型的数据一样进行加法、减法、乘法、除法等操作。

    public BigInteger divide(BigInteger val)这个方法只能得到一个“商“,要想的到余数需要用public BigInteger[] divideAndRemainder(BigInteger val)这个方法。divideAndRemainder()这个方法返回的是存储有”商“和”余数“的BigInteger数组。

    接下来是BigDecimal的用法:

    import java.math.BigDecimal;

    public class TestBigDecimal {
public static void main(String[] args){
String num1 = "954.333333333";
String num2 = "936.55";

//加法运算,保留5位小数
System.out.println("加: "+TestBigDecimal.round(TestBigDecimal.add(num1,num2),5));
//减法运算,保留5位小数
System.out.println("减: "+TestBigDecimal.round(TestBigDecimal.subtract(num1,num2),5));
//乘法运算,保留5位小数
System.out.println("乘: "+TestBigDecimal.round(TestBigDecimal.multiply(num1,num2),5));
//除法运算,保留2位小数
System.out.println("除: "+TestBigDecimal.divide(num1,num2,2));
}

public static double add(String num1,String num2){
BigDecimal b1 = new BigDecimal(num1);
BigDecimal b2 = new BigDecimal(num2);
return b1.add(b2).doubleValue();   //doubleValue将此 BigDecimal转换为 double类型
}
public static double subtract(String num1,String num2){
BigDecimal b1 = new BigDecimal(num1);
BigDecimal b2 = new BigDecimal(num2);
return b1.subtract(b2).doubleValue();
}
public static double multiply(String num1,String num2){
BigDecimal b1 = new BigDecimal(num1);
BigDecimal b2 = new BigDecimal(num2);
return b1.multiply(b2).doubleValue();
}
public static double divide(String num1,String num2,int scale){
BigDecimal b1 = new BigDecimal(num1);
BigDecimal b2 = new BigDecimal(num2);

                //下面的scale表示需要保留的小数位数,“BigDecimal.ROUND_HALF_UP”常量表示的是四舍五入的模式,其他模式详见Api
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
private static double round(double num,int scale) {
BigDecimal b1 = new BigDecimal(num);
BigDecimal b2 = new BigDecimal(1);
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();//任何数除于1都等于本身
}

}

      上面的例子重新包装了BigDecimal的加减乘除操作,使这些方法的使用更符合本例的需要。加减乘的操作就不用多说了,很直接,很简单,需要说明的还是除法操作。 

BigDecimal的除法重载了很多。其中有一种是public BigDecimal divide(BigDecimal divisor,int scale,RoundingMode roundingMode)。这种方法指定了保留的小数位数(scale)和四舍五入的模式(roundingMode)。比如,“ROUND_HALF_DOWN“的模式表示向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐