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

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

BigInteger和BigDecimal:

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

其范围如下所示:

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

创建:

new BigXXX():

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

输出:

111111111111111111111111111111111
1221345676867564534.123453678675645342

BigXXX.ValueOf():

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

输出:

111111111111111
12213456768678974

为什么这里打印出来的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());
    }

输出:

111111111111111
111111111111111
111111111111111.32145
111111111111111.32145

方法:

add():相加

substract():相减

multiply:相乘

divide:相除

remainder():取余数

max():取最大值

min():取最小值

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

查看上述方法的源码:

以相加为例:

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

输出:

741258965

divideAndRemainder():得到商和余数

 public static void main(String[] args) {
        BigInteger bigInteger1=new BigInteger("741258963");
        BigInteger bigInteger2=new BigInteger("457123698");
        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("741258963");
        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.570795
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("7418529633217965412369874",16);
        System.out.println(num3);
    }

输出如下所示:

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

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

输出如下所示:

46118400291
相关文章
|
16天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
39 17
|
7天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
12天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
51 4
|
12天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
29 2
|
17天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
6月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
115 0
|
3月前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
5月前
|
Java
深入了解Java中的BigDecimal类及其方法
深入了解Java中的BigDecimal类及其方法
|
5月前
|
安全 Java
java中BigDecimal详解
java中BigDecimal详解
|
6月前
|
算法 Java API
java BigDecimal使用详细介绍
java BigDecimal使用详细介绍
java BigDecimal使用详细介绍