Java中的BigInteger类与BigDecimal类,细解,带例题


BigInteger


(大整数类)

使用时导包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));
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值