(大整数类)
使用时导包:java.math.BigInteger
作用:可以使用BigInteger操作大整数,也可以转换进制。如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。这些大数都会以字符串的形式传入。
一、常用构造方法:
1.
BigInteger(int numBit,Random rnd)
构造一个随机生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)范围内均匀分布的值。
eg:
生成五个范围在0 到 (2^1000 - 1)的随机整数
import java.math.BigInteger;
import java.util.Random;
public class 大整数 {
public static void main(String[] args) {
Random rnd=new Random();
for (int i = 0; i < 5; i++) {
BigInteger a=new BigInteger(1000, rnd);
System.out.println(a);
}
}
}
BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
eg:
public class 大整数_1 {
public static void main(String[] args) {
BigInteger a= new BigInteger("1323465413");
System.out.println(a);//1323465413
}
}
BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
eg:
public class 大整数_2 {
public static void main(String[] args) {
BigInteger a= new BigInteger("11",2);
System.out.println(a);//3
}
}
二、BigInteger常量:
BigInteger.ONE ------>1
BigInteger.TEN ------>10
BigInteger.ZERO----->0
eg:
public class 大整数_3 {
public static void main(String[] args) {
BigInteger a=BigInteger.ONE;
BigInteger b= BigInteger.TEN;
System.out.println(a);//1
System.out.println(b);//10
}
}
三、常用方法
(BigInteger所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigInteger的对象)
add(); 大整数相加,然后返回这个对象。
subtract(); 相减
multiply(); 相乘
divide(); 相除取整
remainder(); 取余
pow(); a.pow(b)=a^b
gcd(); 最大公约数
abs(); 绝对值
negate(); 取反数
mod(); a.mod(b)=a%b=a.remainder(b);
max(); 取大
min(); 取小
punlic int compareTo();
boolean equals(); 是否相等
valueOf(long val);其值等于指定 long 的值的 BigInteger。
xor(BigInteger val);返回值为 (this ^ val) 的 BigInteger。
**
BigDecimal**
(大浮点数类)
使用时导包:java.math.BigInteger
作用:与BigInteger同理,可以用BigInteger来对超过16位有效位的数进行精确的运算。解决浮点型变量在进行计算的时候会出现丢失精度的问题。如下面的例子所示。
public class 精度损失 {
public static void main(String[] args) {
System.out.println(0.15 + 0.02);//0.16999999999999998
System.out.println(8.21 - 0.22);//7.990000000000001
System.out.println(6.65 * 50.2);//333.83000000000004
System.out.println(23.3 / 100.3);//0.23230309072781657
}
}
一、常用构造方法
1.
BigDecimal(BigInteger val)
将 BigInteger 转换为 BigDecimal。
2.
BigDecimal(BigInteger unscaledVal,int scale)
将 BigInteger 非标度值和 int 标度转换为 BigDecimal。
eg:
public class 大浮点数_1 {
public static void main(String[] args) {
BigDecimal a=new BigDecimal(new BigInteger("11"),2);
System.out.println(a.toPlainString());//0.11
}
}
BigDecimal(String val)
将 BigDecimal 的字符串表示形式转换为 BigDecimal。
eg:
public class 大浮点数_2 {
public static void main(String[] args) {
BigDecimal a=new BigDecimal(2.01);
System.out.println(a.toPlainString());//2.01
}
}
BigDecimal(char[] in)
将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列。
eg:
public class 大浮点数_3 {
public static void main(String[] args) {
char[] arr={'1','2'};
BigDecimal a=new BigDecimal(arr);
System.out.println(a.toPlainString());//12
}
}
BigDecimal(double val)
将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
(注意:BigDecimal精度也丢失,我们在使用BigDecimal时,使用它的BigDecimal(String)构造器创建对象才有意义。其他的如BigDecimal b = new BigDecimal(double)这种,还是会发生精度丢失的问题。如下面代码:)
eg:
public class 大浮点数_4 {
public static void main(String[] args) {
BigDecimal a=new BigDecimal(2.01);
System.out.println(a.toPlainString());//2.0099999999999997868371792719699442386627197265625
}
}
(注意:BigDecimal精度丢失的解决方法,使用 Double.toString(double) 方法提供的 double 规范的字符串表示形式将 double 转换为 BigDecimal。——>valueOf(double val) )
二、常用方法:
同BigInteger一样,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
(BigDecimal) ; 大浮点数相加,然后返回这个对象。
subtract(BigDecimal);相减
multiply(BigDecimal) ;相乘
divide(BigDecimal); 相除
abs(); 绝对值
max(); 取大
min(); 取小
doubleValue();将此 BigDecimal 转换为 double。
floatValue();将此 BigDecimal 转换为 float。
intValue(); 将此 BigDecimal 转换为 int。
longValue();将此 BigDecimal 转换为 long。
negate();返回 BigDecimal,其值为 (-this),其标度为 this.scale()。
pow(int n); 返回其值为 (this^n) 的 BigDecimal。
scale(); 返回此 BigDecimal 的标度。
toPlainString();返回不带指数字段的此 BigDecimal 的字符串表示形式。
toString() ;返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法。
compareTo(BigDecimal val);将此 BigDecimal 与指定的 BigDecimal 比较。(注意:相同返回0,不同返回1)
黄金连分数(2013年蓝桥杯JavaB组第四题)
黄金分割数0.61803… 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
1
黄金数 = ---------------------
1
1 + -----------------
1
1 + -------------
1
1 + ---------
1 + ...
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为:0.618
小数点后4位的值为:0.6180
小数点后5位的值为:0.61803
小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)
你的任
务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入! 尾数是0也要保留!
答案代码:
import java.math.BigDecimal;
import java.math.BigInteger;
public class 黄金分割 {
public static void main(String[] args) {
BigInteger a=BigInteger.ONE;
BigInteger b= BigInteger.ONE;
for (int i = 0; i <300 ; 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.println(divide.toPlainString().substring(0,103));
}
}