天天看点

Java——大数操作(BigInteger、BigDecimal)

本文目标

可以使用BigInteger操作大整数

可以使用BigDecimal指定小数的保留位数

基础知识

对于二进制来说,最高位代表正负号,-0表示-128,+0表示0

32位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1

最大负数:10000000 00000000 00000000 00000000

最大正数:01111111 11111111 11111111 11111111

0:                 00000000 00000000 00000000 00000000

64位系统同理,int型表示范围是:-(2的63次方) ~ (2的63次方) 减 1

具体内容

正常情况下一个整数最多只能放在long类型之中,但是如果现在有如下的一个数字:

        1111111111111111111111111111111111111111111111111

根本就是无法保存的,所以为了解决这样的问题,在java中引入了两个大数的操作类:

        操作整型:BigInteger

        操作小数:BigDecimal

当然了,这些大数都会以字符串的形式传入。

        如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。

        BigInteger是在java.math包中。

代码示例:

[java]  view plain  copy

发现divide()方法本身只是把最终的商保存下来了,但是这样的两个数字相除的时候肯定是无法整除,肯定存在余数,所以我们在上面代码中还用到了divideAndRemainder()方法来获得结果和余数。

        使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

        对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

Java——大数操作(BigInteger、BigDecimal)

华为机试题

        现在我们来看一道华为的机试题:

        写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

        一开始,我写的答案是这样的:

        这里,我直接使用的JavaAPI--Integer提供的方法,将十六进制进行转换,答案也是牛客网AC。但是,仔细一想,华为这样的大公司不可能出这么简单的题目,所以我就想到了处理大数的情况,更改后的代码如下,同样牛客AC。

Java——大数操作(BigInteger、BigDecimal)

总结

1、虽然在开发中很少遇到大数字的操作情况。

2、使用BigDecimal可以指定好四舍五入的精确位置。