java⼤数类详解今天在做蓝桥杯的计算黄⾦连分数100位⼩数时发现对⼤数类不太熟练,所以在此记录⼀下:
题⽬如下:
这题需要⽤到⼤数类的相关⽅法,所以现在我们先来学习和回顾下相关知识:let' get it!
我们可以使⽤BigInteger操作⼤整数
可以使⽤BigDecimal指定⼩数的保留位数
基础知识
对于⼆进制来说,最⾼位代表正负号,-0表⽰-128,+0表⽰0
32位系统int型4个字节:-(2的31次⽅) ~ (2的31次⽅) 减 1
最⼤负数:10000000 00000000 00000000 00000000
最⼤正数:01111111 11111111 11111111 11111111
0: 00000000 00000000 00000000 00000000
64位系统同理,int型表⽰范围是:-(2的63次⽅) ~ (2的63次⽅) 减 1
具体内容
⼤数操作
bigdecimal除法保留小数正常情况下⼀个整数最多只能放在long类型之中,但是如果现在有如下的⼀个数字:
1111111111111111111111111111111111111111111111111
根本就是⽆法保存的,所以为了解决这样的问题,在java中引⼊了两个⼤数的操作类:
操作整型:BigInteger
操作⼩数:BigDecimal
当然了,这些⼤数都会以字符串的形式传⼊。
BigInteger
如果在操作的时候⼀个整型数据已经超过了整数的最⼤类型长度long的话,则此数据就⽆法装⼊,所以,此时要使⽤BigInteger类进⾏操作。
BigInteger是在java.math包中。
代码⽰例:
package bigdataapi;
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]) ;
}
}
发现divide()⽅法本⾝只是把最终的商保存下来了,但是这样的两个数字相除的时候肯定是⽆法整除,肯定存在余数,所以我们在上⾯代码中还⽤到了divideAndRemainder()⽅法来获得结果和余数。
BigDecimal
使⽤此类可以完成⼤的⼩数操作,⽽且也可以使⽤此类进⾏精确的四舍五⼊,这⼀点在开发中经常使⽤。
对于不需要任何准确计算精度的程序可以直接使⽤float或double完成,但是如果需要精确计算结果,则必须使⽤BigDecimal类。
代码⽰例:
package bigdataapi;
import java.math.BigDecimal;
public class BigDecimalDemo01 {
public static void main(String[] args) {
System.out.println("加法运算:" + und(MyMath.add(10.345,3.333),1)) ; System.out.println
("减法运算:" + und(MyMath.sub(10.345,3.333),3)) ; System.out.println("乘法运算:" + und(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() ;
}
}
最后是蓝桥杯黄⾦连分数这题的代码:
import java.math.BigDecimal;
import java.math.BigInteger;
public class 黄⾦连分数 {
public static void main(String[] args) {
BigInteger a=BigInteger.ONE;
BigInteger b=BigInteger.TWO;
for (int i=0;i<100;i++){
BigInteger t=b;
b =a.add(b);
a=t;
}
BigDecimal divide=new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
System.out.PlainString().substring(0,103));
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论