Java之⼤数字类型——⼤整数类型(BigInteger)和⼤⼩数类型(BigDecimal)⼤数字类型⽬的是为了破除基本类型因为精度限制⽽存在表达范围的藩篱。
其分别是⽤于表达超⼤整数(任意⼤⼩,⽆数值范围限制)的⼤整数类型(BigInteger)和能够表达许多位⼩数的⼤⼩数类型(BigDecimal)。
1.⼤整数BigInteger
import java.math.BigInteger;
⾸先,对于初始化则不像基本类型包装这块讲着3种⽅式,这⾥只剩下valueOf() 可以对其初始化。
接着,⼤整数变量不能使⽤算术运算符,需要通过以下⽅法进⾏运算:
add():取代了加法运算符“+”;
subtract():取代了减法运算符“-”;
multiply():取代了乘法运算符“*”;
divide():取代了除法运算符“/”;
remainder():取代了取余运算符“%”;
negate():取代了负号运算符“-”。
【代码】
......
BigInteger nine = BigInteger.valueOf(9);// ⽣成⼀个指定数值的⼤整数变量
BigInteger four = BigInteger.valueOf(4);// ⽣成⼀个指定数值的⼤整数变量
BigInteger sum = nine.add(four);// add⽅法⽤来替代加法运算符“+”
System.out.println("sum="+sum);
BigInteger sub = nine.subtract(four);// subtract⽅法⽤来替代减法运算符“-”
System.out.println("sub="+sub);
BigInteger mul = nine.multiply(four);// multiply⽅法⽤来替代乘法运算符“*”
System.out.println("mul="+mul);
BigInteger div = nine.divide(four);// divide⽅法⽤来替代除法运算符“/”
System.out.println("div="+div);
BigInteger remainder = ainder(four);// remainder⽅法⽤来替代取余数运算符“%”
System.out.println("remainder="+remainder);
BigInteger neg = ate();// negate⽅法⽤来替代负号运算符“-”
System.out.println("neg="+neg);
再次,Java虽提供Math数学函数库,但此函数库只适⽤于操作基本数字类型变量。因⽽BigInteger另外提供了 abs⽅法 和 pow⽅法 。【代码】
......
bigdecimal除法保留小数BigInteger abs = nine.abs();// abs⽅法⽤来替代数学库函数Math.abs
System.out.println("abs="+abs);
BigInteger pow = nine.pow(2);// pow⽅法⽤来替代数学库函数Math.pow
System.out.println("pow="+pow);
2.⼤⼩数BigDecimal
import java.math.BigDecimal;
⼤⼩数的初始化和相关运算都与⼤整数的保持⼀致,应⽤⽅式都是⼀样的。
但有⼀点易错:如果使⽤divide⽅法求出来的结果为⽆限循环⼩数,则程序会异常退出,那如何解决这样的问题呢?
除法运算的divide⽅法需要3个输⼊参数:除数、需保留的⼩数位数、多余数字的舍⼊规则 。
BigDecimal提供的数字舍⼊规则如下:
ROUND_CEILING:往数值较⼩的⽅向取整,类似于Math库的ceiling函数。
ROUND_FLOOR:往数值较⼤的⽅向取整,类似于Math库的floor函数。
ROUND_HALF_UP:四舍五⼊取整,若多余的数字等于.5,则前⼀位进1,类似于Math库的round函数。
ROUND_HALF_DOWN:类似四舍五⼊取整,区别在于:若多余的数字等于.5,则直接舍弃。
【注】通常情况下四舍五⼊会采取:RoundingMode.HALF_UP (impot java.math.RoundingMode;)
ROUND_HALF_EVEN:如果保留位数的末尾为奇数,则按照ROUND_HALF_UP⽅式取整。如果保留位数的末尾为偶数,则按照ROUND_HALF_DOWN⽅式取整。
【代码】
......
BigDecimal one = BigDecimal.valueOf(100);
BigDecimal three = BigDecimal.valueOf(3);
// ⼤⼩数的除法运算,⼩数点后⾯保留64位,其中最后⼀位做四舍五⼊
BigDecimal div = one.divide(three,64, BigDecimal.ROUND_HALF_UP);
System.out.println("div="+div);
为了减少后⾯两个精度参数反复调⽤改动,Java⼜提供了精度⼯具 MathContext ,即事先指定包含⼩数精度和舍⼊规则在内的精度规则。import java.math.MathContext;
【优化代码】
// 利⽤⼯具MathContext,可以把divide⽅法的输⼊参数减少为两个(优化)
MathContext mc =new MathContext(64, RoundingMode.HALF_UP);//RoundingMode.HALF_UP 通常代表四舍五⼊
BigDecimal divByMC = one.divide(three, mc);// 根据指定的精度规则执⾏除法运算
System.out.println("divByMC="+divByMC);
在⼤⼩数的除法中引⼊精度⼯具MathContext⾄少有以下两个好处:
1. 精度规则只要定义⼀次,即可多处使⽤;
2. 若要变更精度规则,则只需要修改⼀个地⽅。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论