关于Java大数操作(BigInteger、BigDecimal)

一.BigInteger

1、可以使用BigInteger操作大整数

如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。BigInteger是在java.math包中。

代码示例:

package ustc.lichunchun.bigdataapi;

import java.math.BigInteger;

public class BigIntegerDemo1 {

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

发现divide()方法本身只是把最终的商保存下来了,但是这样的两个数字相除的时候肯定是无法整除,肯定存在余数,所以我们在上面代码中还用到了divideAndRemainder()方法来获得结果和余数。

二.BigDecimal

1、可以使用BigDecimal指定小数的保留位数

使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

package ustc.lichunchun.bigdataapi;

import java.math.BigDecimal;

public class BigDecimalDemo01 {

            public static void main(String[] args) {
                      System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;
                      System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;
                      System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),4)) ;
                      System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;
       }
}
class MyMath{
            public static double add(double d1,double d2){    // 进行加法计算
                     BigDecimal b1 = new BigDecimal(d1) ;
                     BigDecimal b2 = new BigDecimal(d2) ;
                     return b1.add(b2).doubleValue() ;
            }
            public static double sub(double d1,double d2){    // 进行减法计算
                     BigDecimal b1 = new BigDecimal(d1) ;
                     BigDecimal b2 = new BigDecimal(d2) ;
                     return b1.subtract(b2).doubleValue() ;
            }
            public static double mul(double d1,double d2){    // 进行乘法计算
                     BigDecimal b1 = new BigDecimal(d1) ;
                     BigDecimal b2 = new BigDecimal(d2) ;
                     return b1.multiply(b2).doubleValue() ;
            }
            public static double div(double d1,double d2,int len){    // 进行除法计算
                     BigDecimal b1 = new BigDecimal(d1) ;
                     BigDecimal b2 = new BigDecimal(d2) ;
                     return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
            }
            public static double round(double d,int len){    // 进行四舍五入
                     BigDecimal b1 = new BigDecimal(d) ;
                     BigDecimal b2 = new BigDecimal(1) ; // 技巧
                     return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
            }
};

2、BigDecimal加减乘除的基本用法

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。

在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。

BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。

方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

import java.math.BigDecimal;
public class T {
    public static void main(String[] args) {
        String a = "9999.9999";
        int b = 9999;
        double c = 9999.9999;
        char d = 99;
        System.out.println("===================");
        // 不同类型转为BigDecimal
        BigDecimal ma = new BigDecimal(a);
        BigDecimal mb = new BigDecimal(b);
        BigDecimal mc = new BigDecimal(c);
        BigDecimal md = new BigDecimal(d);
        System.out.println("ma:"+ma.toString());
        System.out.println("mb:"+mb.toString());
        System.out.println("mc:"+mc.toString());
        System.out.println("md:"+md.toString());
        System.out.println("===================");
        //
        BigDecimal add = ma.add(mb);
        System.out.println("加法:"+add);
        //
        BigDecimal sub = ma.subtract(mb);
        System.out.println("减法:"+sub);
        //
        BigDecimal mul = mb.multiply(md);
        System.out.println("乘法:"+mul);
        //
        BigDecimal div = mb.divide(md);
        System.out.println("除法:"+div);
        System.out.println("===================");
        mc = mc.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("四舍五入:"+mc);
        System.out.println("===================");
        mc = mc.negate();
        System.out.println("负数:"+mc);
        System.out.println("===================");
    }
}

BigDecimal和String的相互转换:

/*由数字字符串构造BigDecimal的方法 
*设置BigDecimal的小数位数的方法 
*/ 
import java.math.BigDecimal; 
//数字字符串 
String StrBd="1048576.1024"; 
//构造以字符串内容为值的BigDecimal类型的变量bd 
BigDecimal bd=new BigDecimal(StrBd); 
//设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入) 
bd=bd.setScale(2, BigDecimal.ROUND_HALF_UP); 
//转化为字符串输出 
String OutString=bd.toString(); 
原文地址:https://www.cnblogs.com/ZJOE80/p/9764927.html