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)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。