java⼤数值计算BigInteger和BigDecimal
java.math包中有两个重要的类:BigInteger 和 BigDecimal,这两个类可以处理包含任意长度数字序列的数值。
BigInteger实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
使⽤静态valueOf⽅法可以将普通的数值转换为⼤数值,不能⽤熟悉的算数运算符(+/*)处理⼤数值,只能⽤⼤数值类中的add和multiply 等⽅法。
(1)BigInteger
BigInteger⽐Integer表⽰的数字范围⼤的多,Integer是int的包装类,int的最⼤值为2³¹-1,如果要计算更⼤的数字,使⽤ Integer 数据类型就⽆法实现了,所以 Java 中提供了 BigInteger 类来处理更⼤的数字。 BigInteger ⽀持任意精度的整数,也就是说在运算中BigInteger 类型可以准确地表⽰任何⼤⼩的整数值⽽不会丢失任何信息。
在 BigInteger 类中封装了多种操作,除了基本的加、减、乘、除操作之外,还提供了绝对值、相反数、最⼤公约数以及判断是否为质数等操作。
使⽤ BigInteger 类,可以实例化⼀个 BigInteger 对象,并⾃动调⽤相应的构造函数。 BigInteger 类具有很多构造函数,但最直接的⼀种⽅式是参数以字符串形式代表要处理的数字。
语法如下:
public BigInteger(String val)
其中 , val 是⼗进制字符串。
如果将 2 转换为 BigInteger 类型,可以使⽤⼀下语句进⾏初始化操作 :
BigInteger twoInstance = new BigInteger("2"); //将⼗进制 2 转换为 BigInteger 形式
参数 2 的双引号不能省略,因为参数是以字符串的形式存在的。
⼀旦创建了对象实例,就可以调⽤ BigInteger 类中的⼀些⽅法进⾏运算操作,包括基本的数学运算和位运算以及⼀些取相反数、取绝对值等操作。下⾯列举⼏种常⽤运算⽅法 :
( 1 ) public BigInteger add(BigInteger val) :做加法运算
( 2 ) public BigInteger subtract(BigInteger val) :做减法运算
( 3 ) public BigInteger multiply(BigInteger val) :做乘法运算
( 4 ) public BigInteger divide(BigInteger val) :做除法运算
( 5 ) public BigInteger remainder(BigInteger val) :做取余运算
( 6 ) public BigInteger[] divideAndRemainder (BigInteger val) :⽤数组返回余数和商,结果数组中第⼀个值为商,第⼆个值为余数
( 7 ) public BigInteger pow(int exponent) :进⾏取参数的 exponent 次⽅操作
( 8 ) public BigInteger negate() :取相反数
( 9 ) public BigInteger shiftLeft(int n) :将数字左移 n 位,如果 n 为负数,做右移操作
( 10 )public BigInteger shiftRight(int n) :将数字右移 n 位,如果 n 为负数,做左移操作
( 11 )public BigInteger and(BigInteger val) :做与操作
( 12 )public BigInteger or(BigInteger val) :做或操作
( 13 )public int compareTo(BigInteger val) :做数字⽐较操作
( 14 )public boolean equals(Object x) :当参数 x 是 BigInteger 类型的数字并且数值相等时,返回 true
( 15 )public BigInteger min(BigInteger val) :返回较⼩的数值
( 16 )public BigInteger max(BigInteger val) :返回较⼤的数值
eg : 创建类,在类的主⽅法中创建 BigInteger 类的实例对象,调⽤该对象的各种⽅法实现⼤整数的加、减、乘、除和其他运算,并输出运算结果。
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("4");//实例化⼀个⼤数字
System.out.println("加法操作:" + bigInteger.add(new BigInteger("2")));
System.out.println("减法操作:" + bigInteger.subtract(new BigInteger("2")));
System.out.println("乘法操作:" + bigInteger.multiply(new BigInteger("2")));
System.out.println("除法操作:" + bigInteger.divide(new BigInteger("2")));
System.out.println("取商操作:" + bigInteger.divideAndRemainder(new BigInteger("3"))[0]);
System.out.println("取余数操作:" + bigInteger.divideAndRemainder(new BigInteger("3"))[1]);
System.out.println("做 2 次⽅操作:" + bigInteger.pow(2));
System.out.println("取相反数操作:" + ate());
}
}
结果如下:
加法操作:6
减法操作:2
乘法操作:8
除法操作:2
取商操作:1
取余数操作:1
做 2 次⽅操作:16
取相反数操作:-4
(2)BigDecimal
BigDecimal 和 BigInteger 都能⽤来实现⼤数字的运算,不同的是 BigDecimal 加⼊了⼩数的概念。⼀般的 float 型和 double 型数据只
可以⽤来做科学计算或⼯程计算,但由于在商业计算中要求数字精度⽐较⾼,所以要⽤到 java.math.BigDecimal 类。 BigDecimal 类⽀持
任何精度的定点数,可以⽤它来精确计算货币值。
在 BigDecimal 类中常⽤的两个构造⽅法如下 :
public BigDecimal(double val) : 实例化时将双精度型转换为 BigDecimal 类型
public BigDecimal(String val) : 实例化时将字符串形式转换为 BigDecimal 类型
BigDecimal 类型的数字可以⽤来做超⼤的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽的情
况下末位⼩数点的处理是需要考虑的。
下⾯列举 BigDecimal 类中实现加、减、乘、除的⽅法 :
public BigDecimal add(BigDecimal augend) :做加法操作
public BigDecimal subtract(BigDecimal subtrahend) :做减法操作
public BigDecimal multiply(BigDecimal multiplicand) :做乘法操作
public BigDecimal divide(BigDecimal divisor , int sacle ,int roundingMode) :做除法操作,⽅法中 3 个参数分别代表除数、商的⼩数点后的位数、近似处理模式在上述⽅法中,BigDecimal 类中 divide()
⽅法有多种设置,⽤于返回商末位⼩数点的处理,这些模式的名称与含义如下 :
eg : 创建类,在类中分别定义 add() 、sub() 、mul() 和 div() ⽅法实现加、减、乘、除运算,并输出运算结果。
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
/**
* 定义加法⽅法,参数为加数与被加数
* @param value1 相加的第⼀个数
* @param value2 相加的第⼆个数
* @return 两数之和
*/
public BigDecimal add(double value1 , double value2) {
//实例化 Decimal 对象
BigDecimal b1 = new String(value1));
BigDecimal b2 = new String(value2));
return b1.add(b2); //调⽤加法⽅法
}
/**
* 定义减法⽅法,参数为减数与被减数
* @param value1 被减数
* @param value2 减数
* @return 运算结果
*/
public BigDecimal sub(double value1 , double value2) {
//实例化 Decimal 对象
BigDecimal b1 = new String(value1));
BigDecimal b2 = new String(value2));
return b1.subtract(b2); //调⽤减法⽅法
}
/**
* 定义乘法⽅法,参数为乘数与被乘数
* @param value1 第⼀个乘数
* @param value2 第⼆个乘数
* @return 运算结果
*/
public BigDecimal mul(double value1 , double value2) {
//实例化 Decimal 对象
BigDecimal b1 = new String(value1));
BigDecimal b2 = new String(value2));
return b1.multiply(b2); //调⽤乘法⽅法
}
/**
* 定义除法⽅法,参数为除数与被除数
* @param value1 被除数
* @param value2 除数
* @return 运算结果
*/
public BigDecimal div(double value1 , double value2) {
return div(value1, value2,location);//调⽤⾃定义除法⽅法
}
public BigDecimal div(double value1 , double value2 ,int b) {
if (b<0) {
System.out.println("b 值必须⼤于等于 0");
}
BigDecimal b1 = new String(value1));
BigDecimal b2 = new String(value2));
//调⽤除法⽅法,商⼩数点保留 b 位,并将结果进⾏四舍五⼊操作
return b1.divide(b2,b,BigDecimal.ROUND_HALF_UP);
}
public static void main(String[] args) {
BigDecimalDemo b = new BigDecimalDemo();
System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9));
System.out.println("两个数字相减结果:" + b.sub(-7.5, 8.9));
System.out.println("两个数字相乘结果:" + b.mul(-7.5, 8.9));
bigdecimal除法保留小数System.out.println("两个数字相除结果,结果⼩数后保留 10 位:" + b.div(10,2)); System.out.println("两个数字相除,保留⼩数后 5 位:" + b.div(-7.8,8.9,5));
}
}
运⾏结果如下:
两个数字相加结果:1.4
两个数字相减结果:-16.4
两个数字相乘结果:-66.75
两个数字相除结果,结果⼩数后保留 10 位:5.0000000000
两个数字相除,保留⼩数后 5 位:-0.87640
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论