深入理解Java中的BigInteger和 BigDecimal,再也不怕面试了

Integer类作为int的包装类,能存储的最大整型值为2^31-1 ,Long类最大为2^63-1,虽然比Integer类大了很多,但是也是有限的。如果想要表示更大的整数,不管是基本数据类型还是它们对应的包装类都无法实现。Java中提供了两个用于高精度计算的类:BigInteger和BigDecimal,这两个类包含的方法、提供的操作与基本类型及其对应的包装类相同,并提供了java.lang.Math的所有相关方法。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

1、BigInteger类

java.math包下的BigInteger可以表示不可变的任意精度的整数,主要是针对整型大数字的处理类,在运算中可以准确地表示任何大小的整数值,而不会丢失任何信息。
常用构造器:

BigInteger(String val):根据字符串构建BigInteger对象
//如下所示:
BigInteger bigInteger=new BigInteger("1234567891011121314151617181920");
System.out.println(bigInteger);//1234567891011121314151617181920

常用方法:

public BigInteger abs():返回对象的绝对值
public BigInteger pow(int exponent) :返回对象的平方数
public BigInteger add(BigInteger val) :返回对象与另一个对象的和
public BigInteger subtract(BigInteger val) :返回对象与另一个对象的差
public BigInteger multiply(BigInteger val):返回对象与另一个对象的积
public BigInteger divide(BigInteger val) :返回对象与另一个对象的商,整数相除只保留整数部分
public BigInteger remainder(BigInteger val) :返回对象与另一个对象的余数
public int compareTo(BigInteger val):比较对象与另一个对象的大小

2、BigDecimal类

由于float类型和double在计算时很容易丢失精度。但在商业计算中,尤其是与计算货币值相关时,要求数字的精度很高,Java提供了java.math.BigDecimal类用来实现任意精度的浮点数运算,可以用它进行精确的货币计算。
常用构造器:

BigDecimal(int val):根据int类型的数字构建BigDecimal对象
BigDecimal(long val):根据long类型的数字构建BigDecimal对象
BigDecimal(double val):根据double类型的数字构建BigDecimal对象
BigDecimal(String val):根据字符串构建BigDecimal对象
BigDecimal(BigInteger val):根据BigInteger类型的数字构建BigDecimal对象

常用方法:

public BigDecimal abs():返回对象的绝对值
public BigDecimal pow(int n) :返回对象的平方数
public BigDecimal add(BigDecimal augend)  :返回对象与另一个对象的和
public BigDecimal subtract(BigDecimal subtrahend):返回对象与另一个对象的差
public BigDecimal multiply(BigDecimal multiplicand):返回对象与另一个对象的积
public BigDecimal remainder(BigDecimal divisor):返回对象与另一个对象的余数
public int compareTo(BigDecimal val):比较对象与另一个对象的大小

BigDecimal可以用来做超大的浮点数的运算,比如+ - * /的运算,其中除法运算是最复杂的,因为商的位数可能有除不进的情况,此时需要考虑末位小数点的处理。

//参数1:被除数   参数2:表示小数近似处理的模式(舍入模式)
public BigDecimal divide(BigDecimal divisor, int roundingMode) 

常用的舍入模式:

  • BigDecimal.ROUND_UP:最后一位如果大于0,则向前进一位,正负数都如此;
  • BigDecimal.ROUND_DOWN:最后一位不管是什么都会被舍弃;
  • BigDecimal.ROUND_CEILING:如果是正数,按ROUND_UP处理,如果是负数,按照ROUND_DOWN处理;
    例如8.1->9; -8.1->-8;所以这种近似的结果都会>=实际值。
  • BigDecimal.ROUND_FLOOR:跟BigDecimal_ROUND_CEILING相反,如果是正数,按ROUND_DOWN处理,如果是负数,按照ROUND_UP处理;
    例如8.1->8;-8.1->-9,这种处理的结果<=实际值
  • BigDecimal.ROUND_HALF_UP:如果最后一位<5则舍弃,如果>=5, 向前进一位,即为四舍五入模式;
    例如:7.5->8;7.4->7;-7.5->-8
  • BigDecimal.ROUND_HALF_DOWN:如果最后一位<=5则舍弃,如果>5,则向前进一位;
    例如:7.5->7;7.6->8;-7.5->-7
  • BigDecimal.ROUND_HALF_EVEN :如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理,如果是偶数,按照BigDecimal.ROUND_HALF_DOWN来处理。
    例如:7.5->8;8.5->8;7.4->7;-7.5->-8

你可能感兴趣的:(Java,java,BigInteger,BigDecimal)