java学习笔记之高精度
BigInteger部分
import java.math.BigInteger; import java.util.Scanner; public class BI { public static void main(String[] args) { // TODO Auto-generated method stub //构造函数 BigInteger a = BigInteger.valueOf(10); BigInteger b = BigInteger.valueOf(2000); System.out.println(a); System.out.println(b); //加法 System.out.println(a.add(b)); System.out.println(a.add(a)); System.out.println(a.add(b).add(b)); //减法 System.out.println(a.subtract(a)); System.out.println(a.subtract(b)); System.out.println(b.subtract(a).subtract(a)); //乘法 System.out.println(a.multiply(a)); System.out.println(a.multiply(b)); System.out.println(a.multiply(b).multiply(b)); //除法 System.out.println(a.divide(a)); System.out.println(a.divide(b));//10/2000=0 System.out.println(b.divide(a)); System.out.println(b.divide(a).divide(a)); //取模 BigInteger mod = BigInteger.valueOf(3); System.out.println(b.mod(mod)); } } 原文链接:https://blog.csdn.net/hurmishine/article/details/52312902
BIgDecimal部分
构造器描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
方法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
原文链接:https://blog.csdn.net/hurmishine/article/details/52312987
package BD; import java.math.BigDecimal; public class BD { public static void main(String[] args) { // TODO Auto-generated method stub // 构造函数 BigDecimal a = new BigDecimal(10); BigDecimal b = new BigDecimal(10.5); BigDecimal c = new BigDecimal(123456789101222L); BigDecimal d = new BigDecimal("-123456.31"); System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); //四则运算 System.out.println(a.add(b).add(c).add(d)); System.out.println(a.subtract(b).subtract(a)); System.out.println(a.multiply(b).multiply(c)); System.out.println(c.divide(a).divide(new BigDecimal(20))); System.out.println(d.divide(a)); System.out.println(d.doubleValue()); System.out.println(a.compareTo(a));// 0 System.out.println(a.compareTo(b));// -1 System.out.println(b.compareTo(a));// 1 BigDecimal aa = new BigDecimal(10.00); BigDecimal bb = new BigDecimal(10.000); BigDecimal cc = new BigDecimal(200); System.out.println(aa.equals(aa));// true? System.out.println(aa.equals(bb));// true? System.out.println(aa.equals(cc));//false } }
除法运算的函数可以指定小数点后保留位数和取舍规则
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
除法 divide有三个参数的方法,第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则。只有在作除法运算或四舍五入时才用到取舍规则。 因为BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。所以当我们用三参数的除法方法时,规定了保留几位小数以及你的保留方式,就可以避免异常。
ROUND_CEILING:舍位时往正无穷方向移动
正数:1.1 -> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -1 -1.5-> -1 -1.8-> -1
ROUND_DOWN:向0的方向移动
正数:1.1-> 1 1.5-> 1 1.8-> 1
负数:-1.1-> -1 -1.5-> -1 -1.8> -1
ROUND_FLOOR:与CEILING相反,往负无穷
正数: 1.1-> 1 1.5-> 1 1.8-> 1
负数: -1.1-> -2 -1.5-> -2 -1.8-> -2
ROUND_HALF_DOWN:以5为分界线,或曰五舍六入
正数:1.5-> 1 1.6-> 2
负数:-1.5-> -1 -1.6-> -2
ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数
1.15-> 1.2 1.16-> 1.2 1.25-> 1.2 1.26-> 1.3
ROUND_HALF_UP:最常见的四舍五入
ROUND_UNNECESSARY:无需舍位
ROUND_UP与ROUND_DOWN相反,远离0的方向
正数:1.1-> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -2 -1.5-> -2 -1.8-> -2
icpcMacau2021高精除
import java.util.*; import java.math.*; public class bing { public static void main(String []args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); BigDecimal c=new BigDecimal(1.0); BigDecimal d=new BigDecimal(1.0*n); //阶乘 //注意BigInteger.valueOf()的使用 for(int i=1;i<=n;i++) { c=c.multiply(BigDecimal.valueOf(1.0*i)); c=c.multiply(BigDecimal.valueOf(1.0*i)); } for(int i=1;i<=n;++i){ c=c.divide(d,20,RoundingMode.HALF_UP); } System.out.println(c); sc.close(); } }