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

Cerelia ·
更新时间:2024-09-20
· 906 次阅读

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)); } }
作者:巫晴



bigdecimal JAVA

需要 登录 后方可回复, 如果你还没有账号请 注册新账号