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

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

大家好,我是讯享网,很高兴认识大家。

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); } 

输出如下所示:

讯享网 
小讯
上一篇 2025-03-04 20:28
下一篇 2025-02-06 08:41

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34966.html