当前位置: 代码迷 >> 综合 >> Java知识梳理——大数类 BigInteger BigDemical
  详细解决方案

Java知识梳理——大数类 BigInteger BigDemical

热度:37   发布时间:2023-12-29 08:50:38.0

今天在做大数取余时发现Java中大数精度丢失的问题,建议小伙伴们在数字超过double最大位数时用大数类操作

//求10的77次方对19取余
public class Main {public static void main(String[] args){double dou=Math.pow(10,77);DecimalFormat df = new DecimalFormat("#");String str = df.format(dou);BigInteger i=new BigInteger(str);System.out.println(i.mod(BigInteger.valueOf(19)));//正确答案3.0
}
}public class Main {public static void main(String[] args){System.out.println(Math.pow(10,77)%19);//结果是4.0 错误!
}
}

大数操作

BigInteger

import java.math.BigInteger;public class BigIntegerDemo1 {public static void main(String[] args) {BigInteger bi1 = new BigInteger("123456789") ;	// 声明BigInteger对象BigInteger bi2 = new BigInteger("987654321") ;	// 声明BigInteger对象System.out.println("加法操作:" + bi2.add(bi1)) ;	// 加法操作System.out.println("减法操作:" + bi2.subtract(bi1)) ;	// 减法操作System.out.println("乘法操作:" + bi2.multiply(bi1)) ;	// 乘法操作System.out.println("除法操作:" + bi2.divide(bi1)) ;	// 除法操作System.out.println("最大数:" + bi2.max(bi1)) ;	 // 求出最大数System.out.println("最小数:" + bi2.min(bi1)) ;	 // 求出最小数BigInteger result[] = bi2.divideAndRemainder(bi1) ;	// 求出余数的除法操作System.out.println("商是:" + result[0] + ";余数是:" + result[1]) ;}
}

BigDecimal

import java.math.BigDecimal;public class BigDecimalDemo01 {public static void main(String[] args) {System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),4)) ;System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;}
}
class MyMath{public static double add(double d1,double d2){		// 进行加法计算BigDecimal b1 = new BigDecimal(d1) ;BigDecimal b2 = new BigDecimal(d2) ;return b1.add(b2).doubleValue() ;}public static double sub(double d1,double d2){		// 进行减法计算BigDecimal b1 = new BigDecimal(d1) ;BigDecimal b2 = new BigDecimal(d2) ;return b1.subtract(b2).doubleValue() ;}public static double mul(double d1,double d2){		// 进行乘法计算BigDecimal b1 = new BigDecimal(d1) ;BigDecimal b2 = new BigDecimal(d2) ;return b1.multiply(b2).doubleValue() ;}public static double div(double d1,double d2,int len){		// 进行除法计算BigDecimal b1 = new BigDecimal(d1) ;BigDecimal b2 = new BigDecimal(d2) ;return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;}public static double round(double d,int len){	// 进行四舍五入BigDecimal b1 = new BigDecimal(d) ;BigDecimal b2 = new BigDecimal(1) ; // 技巧return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;}
};

 

  相关解决方案