🦔BigInteger和BigDecimal (1)
2021-3-6
| 2023-8-3
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

BigInteger

在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。
如果使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。
 
java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数:
BigInteger做运算的时候,只能使用实例方法,例如加法运算:
 
long型整数运算比,BigInteger不会有范围限制,但缺点是速度比较慢。也可以把BigInteger转换成long型:
使用longValueExact()方法时,如果超出了long型的范围,会抛出ArithmeticException
BigIntegerIntegerLong一样,也是不可变类,并且也继承自Number类。因为Number定义了转换为基本类型的几个方法:
  • 转换为bytebyteValue()
  • 转换为shortshortValue()
  • 转换为intintValue()
  • 转换为longlongValue()
  • 转换为floatfloatValue()
  • 转换为doubledoubleValue()
通过上述方法,可以把BigInteger转换成基本类型。如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常。
 
如果BigInteger的值甚至超过了float的最大范围( ),那么返回的float是什么呢?
 

BigDecimal

BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。也是从Number继承的,也是不可变对象。
BigDecimalscale()表示小数位数:
通过BigDecimalstripTrailingZeros()方法,可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal
如果一个BigDecimalscale()返回负数,例如,-2,表示这个数是个整数,并且末尾有2个0。
可以对一个BigDecimal设置它的scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断:
 
BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时就必须指定精度以及如何进行截断:
还可以对BigDecimal做除法的同时求余数:
 
调用divideAndRemainder()方法时,返回的数组包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。我可以利用这个方法判断两个BigDecimal是否是整数倍数:
 
 

比较BigDecimal

在比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等:
必须使用compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。
 
查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:
  • Java
  • 常用工具类异常处理
    目录