ACM学习笔记——大数运算:Java之BigDecimal与BigInteger

Java BigInteger

经常在算法题中遇到高精度运算的题目,一直用C++模拟人工运算手动实现高精度来做,了解到Java的java.math包中的BigInteger提供了高精度的基本运算,看了一些资料(博客、JDK_API之类)后,在这里进行整理。

关于创建BigInteger对象

首先引用该包:

import java.math.BigInteger;

创建对象:

BigInteger(String val)

关于BigInteger的输入输出

直接读入并输出

Scanner in = new Scanner(System.in);
while(in.hasNext())
{
    
    
    BigInteger a;
    a = in.nextBigInteger();
    //System.out.print(a);//直接输出
    System.out.println(a.toString());//转成十进制的String
}
//输出a的二进制
int p=2;
System.out.print(a.toString(p));

关于BigInteger的基本运算

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

加减乘除

BigInteger a = new BigInteger("111222");
BigInteger b = new BigInteger("222111");
a.add(b);//加法
a.subtract(b);//减法
a.multiply(b);//乘法
a.divide(b);//除法

求最大公约数

BigInteger a = new BigInteger("111222");
BigInteger b = new BigInteger("222111");
System.out.println(a.gcd(b)); 

转换成double类型

BigInteger a = new BigInteger("111222");
BigInteger b = new BigInteger("222111");
System.out.println(a.doubleValue()); 

判断是否为素数

Scanner cin = new Scanner(System.in);
BigInteger x;
x = cin.nextBigInteger();
if(x.isProbablePrime(1))
	System.out.println("It's a Prime.");
else
	System.out.println("It's not a Prime.");

Java BigDecimal

BigInteger主要用于整型计算,而涉及到浮点数需要使用Java 中的BigDecimal。其创建、基本输入输出、基本运算与BigInteger类似,在这里不再赘述,只要改变包名即可,具体方法可查阅API。

import java.math.BigDecimal;

输出(科学计数法、格式化)

1.如果我们希望去除末尾多余的0

BigDecimal a = new BigDecimal("100000.000");
System.out.println( a.stripTrailingZeros().toString());

但此时输出应为科学计数法

1E+5

如果想要避免科学计数法的输出,应该将toString()改为toPlainString()

BigDecimal a = new BigDecimal("100000.000");
System.out.println( a.stripTrailingZeros().toPlainString());

此时程序的输出就为

100000

2.如果希望格式化输出,例如保留两位小数
记得先要引入包

import java.math.RoundingMode;
BigDecimal a = new BigDecimal("100000.000");
      BigDecimal  b =a.setScale(2, RoundingMode.HALF_UP);//保留两位小数
        System.out.println("结果是"+b);

输出为

结果是100000.00

下述引自博客link.

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

猜你喜欢

转载自blog.csdn.net/weixin_45775584/article/details/109124489