BigInteger和BigDecimal的使用

1、BigInteger

BigInteger类型的数字范围较 Integer 类型的数字范围要大得多。我们都知道 Integer 是 Int 的包装类,int 的最大值为 231-1,如果要计算更大的数字,使用Integer 数据类型就无法实现了,所以 Java 中提供了BigInteger 类来处理更大的数字。BigInteger 支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息

基本操作

BigInteger的运算都没有对原值进行操作,而是返回一个新的BigInteger对象,1.valueOf(parament); 将参数转换为制定的类型

int a=3;
BigInteger b=BigInteger.valueOf(a);//b=3
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);//c=12345

2.add(); 大整数相加

BigInteger a=new BigInteger(“23”);

BigInteger b=new BigInteger(“34”);
a. add(b);//57

3.subtract(); 相减

4.multiply(); 相乘

5.divide(); 相除取整

6.remainder(); 取余

7.pow(); a.pow(b)=a^b

8.gcd(); 最大公约数

9.abs(); 绝对值

10.negate(); 取反数

11.mod(); a.mod(b)=a%b=a.remainder(b);

12.max(); min();

13.compareTo()两者比较

基本常量(3个):

BigInteger A=BigInteger.ONE ;  //1
BigInteger B=BigInteger.TEN ;  //10
BigInteger C=BigInteger.ZERO ; //0

键盘读入

Scanner cin=new Scanner(System.in);// 读入
BigInteger scanner = cin.nextBigInteger();
System.out.println(scanner);

进制转换

//进制转换
String str="1011100111";
int radix=2;
BigInteger interNum1 = new BigInteger(str, radix); //743
System.out.println(interNum1);

//我们通常不写,则默认成十进转换
BigInteger interNum2 = new BigInteger(str);//1011100111
System.out.println(interNum2);

类型转换(返回类型如下)

//类型转换
BigInteger bigNum = new BigInteger("52");
int radix=2;
//1.将bigNum转换为byte数组
byte[] num1 = bigNum.toByteArray(); //[52]
System.out.println(Arrays.toString(num1));

//2.将bigNum转换为字符串
String num2 = bigNum.toString();
System.out.println(num2);

//3.将bigNum转换为radix进制的字符串形式
String num3 = bigNum.toString(radix);
System.out.println(num3);

//4.将bigNum转换为int
int num4 = bigNum.intValue();
System.out.println(num4);

//5.将bigNum转换为float
float num5 = bigNum.floatValue();
System.out.println(num5);

//6.将bigNum装换为double
double num6 = bigNum.doubleValue();
System.out.println(num6);

2、BigDecimal

在日常开发中我们经常会碰到小数计算,而小数直接计算的话会出现一些小小的错误,如下:

System.out.println(1.01 + 2.02);

理想输出3.03,实际上输出的是3.0300000000000002。这是因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。有没有不失精度的办法呢?这里就要用到BigDecimal了。

java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算

基本方法如BigInteger,其他用法如下:

使用BigDecimal实现四舍五入(支持float和double类型)

/*
BigDecimal.ROUND_UP 不管保留数字后面是大是小(0除外)都会进1
ROUND_DOWN:保留设置数字,后面所有直接去除
ROUND_HALF_UP:根据保留数字后一位>=5进行四舍五入
ROUND_HALF_DOWN:根据保留数字后一位>=5进行四舍五入
 */
// 设置小数点后第三位数字一大一小观察效果
BigDecimal num =  new BigDecimal("3.3235667");
BigDecimal numOne =  new BigDecimal("3.3255667");
BigDecimal num1 = num.setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("SmallROUND_UP:"+num1);
BigDecimal numTwo = numOne.setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("BigROUND_UP:"+numTwo);

保留有效数字

double d=1.290;
BigDecimal b = new BigDecimal(String.valueOf(d));
BigDecimal divisor=BigDecimal.ONE;
MathContext mc = new MathContext(2); //保留几位就把2改为几
System.out.println(b.divide(divisor,mc)); //但是这里会进行四舍五入,如果要保留几位小时的话,可以使用上面的方法看业务需求进行选择

//对比
BigDecimal result = new BigDecimal("1.290").setScale(2, BigDecimal.ROUND_DOWN);
//1代表保留一位小数,保留几位小数就是几
System.out.println(result);