你知道Java中的BigInteger类和BigDecimal类吗?

你知道Java中的BigInteger类和BigDecimal类吗?我们在学习 JavaSE 基础的时候学习过 int 和 double 前者是整形 后者是双精度浮点数 但它们是有最大值的 也就是说 他两并不支持无限大的数字

大家好,欢迎来到IT知识分享网。

BigInteger和BigDecimal:

我们在学习JavaSE基础的时候学习过int和double,前者是整形,后者是双精度浮点数,但它们是有最大值的,也就是说,他两并不支持无限大的数字。

其范围如下所示:

在这里插入图片描述
在这里插入图片描述

因此对于特别大的数字,Java为我们提供了两个类可用来操作,分别是BigInteger[支持任意长度的整数]BigDecimal[支持任意长度的浮点数],理论上可以存储无限长的数字只要你计算机的内存足够

创建:

new BigXXX():

public static void main(String[] args) { 
    //注意传递的参数是字符串而不是整数或者浮点数 BigInteger bigInteger=new BigInteger(""); System.out.println(bigInteger); BigDecimal bigDecimal=new BigDecimal("."); System.out.println(bigDecimal); } 

输出:

 . 

BigXXX.ValueOf():

 public static void main(String[] args) { 
    BigDecimal bigDecimal=BigDecimal.valueOf(.12); BigInteger bigInteger=BigInteger.valueOf(1111L); System.out.println(bigInteger); System.out.println(bigDecimal); } 

输出:

1111  

为什么这里打印出来的bigDecimal少了我们提供的一部分呢?

问题不在BigDecimal,而在ValueOf,我们提供的是double类型的,而double类型的长度一般在15-17位因此17位以后得会被略掉因此比较好的办法还是使用构造方法的形式创建.

Scanner对象.BigXXX():

public static void main(String[] args) { 
    Scanner scanner=new Scanner(System.in); System.out.println(scanner.nextBigInteger()); System.out.println(scanner.nextBigDecimal()); } 

输出:

1111 1111 1111.32145 1111.32145 

方法:

add():相加

substract():相减

multiply:相乘

divide:相除

remainder():取余数

max():取最大值

min():取最小值

注意:调用BigInteger的上述运算方法时,不能直接传入整形数字,原因如下所示:

查看上述方法的源码:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

以相加为例:

BigInteger bigInteger1=new BigInteger(""); BigInteger bigInteger3=bigInteger1.add(BigInteger.valueOf(2)); System.out.println(bigInteger3); 

输出:

 

divideAndRemainder():得到商和余数

 public static void main(String[] args) { 
    BigInteger bigInteger1=new BigInteger(""); BigInteger bigInteger2=new BigInteger(""); BigInteger[] bigInteger3=bigInteger1.divideAndRemainder(bigInteger2); //得到商 System.out.println(bigInteger3[0]); //得到余数 System.out.println(bigInteger3[1]); } 

注意该方法的返回值是一个BigInteger[],数组中第一个数字是商,第二个数字是余数

在这里插入图片描述

compareTo():比较大小

public static void main(String[] args) { 
    BigInteger bigInteger1=new BigInteger(""); BigInteger bigInteger2=new BigInteger("2"); int result=bigInteger1.compareTo(bigInteger2); System.out.println(result); } 

输出:

bigInteger1大于bigInteger2,成立返回1,否则返回-1,相等返回0

1 

在这里插入图片描述

intValue():转换成int型和doubleValue():转换成double型

public static void main(String[] args) { 
    BigInteger bigInteger2=new BigInteger("2"); int num1= bigInteger2.intValue(); Double num2= bigInteger2.doubleValue(); System.out.println(num1); System.out.println(num2); } 

输出:

2 2.0 

上述方法对于BigDecimal对象同样适用,这里就不过多举例。

注意:BigDecimal对象的divide需要注意的地方如下所示

 public static void main(String[] args) { 
    BigDecimal bigDecimal=new BigDecimal("3.14159"); //未做任何处理 BigDecimal bigDecimal1=bigDecimal.divide(BigDecimal.valueOf(2)); System.out.println(bigDecimal1); //RoundingMode.HALF_UP->四舍五入 BigDecimal bigDecimal2=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.HALF_UP); System.out.println(bigDecimal2); //RoundingMode.UP->向上取整 BigDecimal bigDecimal3=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.UP); System.out.println(bigDecimal3); //RoundingMode.DOWN->向下取整 BigDecimal bigDecimal4=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.DOWN); System.out.println(bigDecimal4); } 

输出:

默认保留和提供的bigDecimal对象相同的位数

1. 1.57080 1.57080 1.57079 

实现进制之间的转换:

public static void main(String[] args) { 
    //二进制转化为10进制 int num=Integer.parseInt("001",2); System.out.println(num); //十六进制转化为10进制 int num1=Integer.parseInt("D",16); System.out.println(num1); //八进制转化为10进制 int num2=Integer.parseInt("00012",8); System.out.println(num2); } 

输出如下所示:

1 13 10 

但是当数据过大的情况下就会抛出异常:

 public static void main(String[] args) { 
    int num3=Integer.parseInt("874",16); System.out.println(num3); } 

输出如下所示:

在这里插入图片描述

那么我们可以使用大数类解决这个问题:

 public static void main(String[] args) { 
    BigInteger bigInteger=new BigInteger("ABCDEF123",16); System.out.println(bigInteger); } 

输出如下所示:

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112996.html

(0)
上一篇 2026-01-14 20:10
下一篇 2026-01-14 20:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信