位置:java.math.BigDecimal
作用:提供高精度小数数据类型及相关操作
一、基本介绍
- BigDecimal为不可变的、任意精度的有符号十进制数,其值为(unscaledValue * 10-scale)其中,unscaledValue(非标度值)为任意精度的整数、scale(标度)为32位整型(可为负)
- 提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
- 用户能通过提供MathContext对象完全控制BigDecimal的舍入行为(也可使用类内提供的8种舍入模式)。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常。
- 由于同一数值可以有不同的表示形式(具有不同的标度),因此运算和舍入的规则必须同时指定数值结果和结果表示形式中所用的标度。
- 一般情况下,当准确结果(在除法中,可能有无限多位)比返回的数值具有更多位数时,舍入模式和精度设置确定操作如何返回具有有限位数的结果(MathContext 的 precision 设置指定要返回的总位数,这确定了结果的精度、位数计数从准确结果的最左边的非零数字开始、舍入模式确定丢弃的尾部位数如何影响返回的结果)。
- 对于所有算术运算符,运算的执行方式是,首先计算准确的中间结果,然后,使用选择的舍入模式将其舍入为精度设置(如有必要)指定的位数。如果不返回准确结果,则将丢弃准确结果的某些数位。当舍入增加了返回结果的大小时,前导数字“9”的进位传播可能会创建新的数位。例如,将值 999.9 舍入为三位数字,则在数值上等于一千,表示为 100×101。在这种情况下,新的 "1" 是返回结果的前导数位。
- 除了逻辑的准确结果外,每种算术运算都有一个表示结果的首选标度。
- 加法:max( addend.scale() , augend.scale() ) //加数与被加数中的较大者
- 减法:max( minuend.scale() , subtrahend.scale() ) //被减数与减数之间的较大者
- 乘法:multiplier.scale() + multiplicand.scale() //乘数与被乘数的和
- 除法:dividend.scale() - divisor.scale() //被除数与除数的差
二、字段
BigDecimal常量
- static BigDecimal ONE //值为 1,标度为 0
- static BigDecimal TEN //值为 10,标度为 0
- static BigDecimal ZERO //值为 0,标度为 0
舍入模式
- static int ROUND_UP //(常量字段值0)远离零的舍入模式(向上舍入)。舍弃某部分时,若舍弃部分非零则对其前面的数字加1(此舍入模式始终不会减少计算值的大小)
- static int ROUND_DOWN //(常量字段值1)接近零的舍入模式(向下舍入)。直接丢弃需舍弃部分(此舍入模式始终不会增加计算值的大小)
- static int ROUND_CEILING //(常量字段值2)接近正无穷大的舍入模式。若BigDecimal为正,则舍入行为同ROUND_UP;若为负,则舍入行为同ROUND_DOWN(此舍入模式始终不会减少计算值大小)
- static int ROUND_FLOOR //(常量字段值3)接近负无穷大(不是无穷小哦)的舍入模式。其行为与ROUND_CEILING相反,若BigDecimal为负,则舍入行为同ROUND_UP;若为正,则舍入行为同ROUND_DOWN(此舍入模式始终不会增加计算值大小)
- static int ROUND_HALF_UP //(常量字段值4)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式(四舍五入,即舍弃部分>=0.5则向上舍入,否则向下舍入)
- static int ROUND_HALF_DOWN //(常量字段值5)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式(舍弃部分<=0.5则向下舍入,否则向上舍入)
- static int ROUND_HALF_EVEN //(常量字段值6)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入(在重复进行一系列计算时,此舍入模式可以将累加错误减到最小)
- static int ROUND_UNNECESSARY //(常量字段值7)断言请求的操作具有精确的结枚,因此不需要舍入,若该操作无精确结果(如1/3)则抛出 ArithmeticException
三、生成BigDecimal对象
构造方法
- BigDecimal(String val) //将 BigDecimal 的字符串表示形式转换为 BigDecimal(可为科学计数法表示、可带前导负号),其标度值为字符串的小数部分数字位数(没有小数点则标度为0)
- BigDecimal(String val, MathContext mc) //将 BigDecimal 的字符串表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符串,并按照上下文设置进行舍入
- BigDecimal(BigInteger val) //将 BigInteger 转换为 BigDecimal(其标度为0)
- BigDecimal(BigInteger val, MathContext mc) //将 BigInteger 转换为 BigDecimal(其标度为0),并根据上下文设置进行舍入
- BigDecimal(BigInteger unscaledVal, int scale) //将 BigInteger 非标度值和 int 标度转换为 BigDecimal
- BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) //将 BigInteger 非标度值和 int 标度转换为 BigDecimal,并根据上下文设置进行舍入
- BigDecimal(char[] in) //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列(如果字符序列已经可以作为一个字符数组使用,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快)
- BigDecimal(char[] in, MathContext mc) //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,并根据上下文设置进行舍入
- BigDecimal(char[] in, int offset, int len) //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,允许指定子数组(以offset为起始,长len)
- BigDecimal(char[] in, int offset, int len, MathContext mc) //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,允许指定子数组(以offset为起始,长len),并根据上下文设置进行舍入
- BigDecimal(int val) //将 int 转换为 BigDecimal,其标度为0
- BigDecimal(int val, MathContext mc) //将 int 转换为 BigDecimal,并根据上下文设置进行舍入,在进行任何舍入之前,BigDecimal的标度为零
- BigDecimal(long val) //将 long 转换为 BigDecimal,其标度为0
- BigDecimal(long val, MathContext mc) //将 long 转换为 BigDecimal,并根据上下文设置进行舍入,在进行任何舍入之前,BigDecimal的标度为零
- BigDecimal(double val) //将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式(由于dounle无法精确表示浮点数,需要以double为参数构造BigDecimal时请先用toString()将double转为字符串,再用该字符串构造BigDecimal,下同)
- BigDecimal(double val, MathContext mc) //将 double 转换为 BigDecimal,并根据上下文设置进行舍入(处理方式同上)。
四、常(suo)用(you)方法
算术运算(+ - * / % mod)
- BigDecimal add(BigDecimal augend) //返回其值为 (this + augend) 的 BigDecimal,其标度为 max( this.scale() , augend.scale() )
- BigDecimal add(BigDecimal augend , MathContext mc) //返回其值为 (this + augend) 的 BigDecimal,并根据上下文设置进行舍入
- BigDecimal subtract(BigDecimal subtrahend) //返回其值为 (this - subtrahend) 的 BigDecimal,其标度为 max(this.scale(), subtrahend.scale())
- BigDecimal subtract(BigDecimal subtrahend , MathContext mc) //返回其值为 (this - subtrahend) 的 BigDecimal,并根据上下文设置进行舍入
- BigDecimal multiply(BigDecimal multiplicand) //返回其值为 (this × multiplicand) 的 BigDecimal,其标度为 ( this.scale() + multiplicand.scale() )
- BigDecimal multiply(BigDecimal multiplicand, MathContext mc) //返回其值为 (this × multiplicand) 的 BigDecimal,并根据上下文设置进行舍入
- BigDecimal divide(BigDecimal divisor) //返回其值为 (this / divisor) 的 BigDecimal,其首选标度为 (this.scale() - divisor.scale())。如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException
- BigDecimal divide(BigDecimal divisor, MathContext mc) //返回其值为 (this / divisor) 的 BigDecimal,并根据上下文设置进行舍入
- BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) //返回其值为 (this / divisor) 的 BigDecimal,其标度为 this.scale() ,如果必须执行舍入以生成具有指定标度的结果,则应用指定的舍入模式
- BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) //返回其值为 (this / divisor) 的 BigDecimal,其标度为指定标度
- BigDecimal divide(BigDecimal divisor, int roundingMode) //(遗留的方法)返回其值为 (this / divisor) 的 BigDecimal,其标度为 this.scale()
- BigDecimal divide(BigDecimal divisor, int scale, int
roundingMode) //(遗留的方法)返回其值为 (this / divisor) 的 BigDecimal,其标度为指定标度 - BigDecimal divideToIntegralValue(BigDecimal divisor) //返回 BigDecimal,其值为向下舍入所得商值 (this / divisor) 的整数部分,其首选标度为 (this.scale() - divisor.scale())
- BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext
mc) //返回 BigDecimal,其值为 (this / divisor) 的整数部分,其首选标度为 (this.scale() - divisor.scale())。(因为准确商值的整数部分与舍入模式无关,所以舍入模式不影响此方法返回的值) - BigDecimal remainder(BigDecimal divisor) //返回其值为 (this % divisor) 的 BigDecimal,余数由this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
给出。注意,这不是模操作(结果可以为负) - BigDecimal remainder(BigDecimal divisor, MathContext mc) //返回其值为 (this % divisor) 的 BigDecimal(根据上下文设置进行舍入) 。MathContext 设置会影响用于计算余数的隐式除法。余数计算本身要进行准确的定义。因此,余数包含的数字个数可能多于
mc.getPrecision()。在进行任何舍入之前,BigDecimal 的标度为零 - BigDecimal[] divideAndRemainder(BigDecimal divisor) //返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder
- BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) //返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder
比较运算
- int compareTo(BigDecimal val) //将此 BigDecimal 与指定的 BigDecimal 比较,使用方法:(a.compareTo(b) <op> 0) ,<op>为6个比较运算符之一(值相等但标度不同的两个BigDecimal被认为是相等的)
- boolean equals(Object x) //比较此 BigDecimal 与指定的 Object 的相等性,当且仅当两个元素同为BigDecimal且二者值与标度都相同时才为真(2.0!=2.00)
数学运算
- BigDecimal abs() //返回 BigDecimal,其值为此 BigDecimal 的绝对值,其标度为 this.scale()
- BigDecimal abs(MathContext mc) //返回其值为此 BigDecimal 绝对值的 BigDecimal(根据上下文设置进行舍入)
- BigDecimal pow(int n) //返回其值为 (thisn) 的 BigDecimal,准确计算该幂,使其具有无限精度
- BigDecimal pow(int n, MathContext mc) //返回其值为 (thisn) 的 BigDecimal(根据上下文设置进行舍入)
- BigDecimal scaleByPowerOfTen(int n) //返回其数值等于 (this * 10n) 的 BigDecimal,其标度为( this.scale() - n )
- BigDecimal max(BigDecimal val) //返回此 BigDecimal 和 val 的最大值(相等返回this,下同)
- BigDecimal min(BigDecimal val) //返回此 BigDecimal 和 val 的最小值
- int hashCode() //返回此 BigDecimal 的哈希码(标度不同但值相同的两个数通常具有不同的哈希码)
与BigDecimal自身相关方法(由于BigDecimal不可变,所有方法均生成一个新BigDecimal而非改变原值)
- BigDecimal movePointLeft(int n) //返回一个 BigDecimal,其值为 (this × 10-n),标度为 max(this.scale()+n, 0)。它等效于将该值的小数点向左移动 n 位,若n<0,该调用等效于movePointRight( abs(n) )
- BigDecimal movePointRight(int n) //返回一个 BigDecimal,其值为 (this × 10n),标度为 max(this.scale()-n, 0)。它等效于将该值的小数点向右移动 n 位,若n<0,该调用等效于movePointLeft( abs(n) )
- BigDecimal negate() //返回其值为 (-this) 的 BigDecimal,其标度为 this.scale()
- BigDecimal negate(MathContext mc) //返回其值为 (-this) 的 BigDecimal(根据上下文设置进行舍入)
- BigDecimal plus() //返回其值为 (+this) 的 BigDecimal,其标度为 this.scale()
- BigDecimal plus(MathContext mc) //返回其值为 (+this) 的 BigDecimal(根据上下文设置进行舍入)
- BigDecimal round(MathContext mc) //返回根据 MathContext 设置进行舍入后的 BigDecimal
- BigDecimal stripTrailingZeros() //返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal
- BigDecimal setScale(int newScale) //返回一个 BigDecimal,其标度为指定值,其值在数值上等于此 BigDecimal 的值
- BigDecimal setScale(int newScale, int roundingMode) //返回一个 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值
- BigDecimal setScale(int newScale, RoundingMode roundingMode) //返回 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值
- int scale() //返回此 BigDecimal 的标度
- int precision() //返回此 BigDecimal 的精度
- int signum() //返回此 BigDecimal 的正负号函数
- BigDecimal ulp() //返回此 BigDecimal 的 ulp(最后一位的单位)的大小
BigDecimal与其他类型转换
- static BigDecimal valueOf(double val) //使用 Double.toString(double) 方法提供的 double 规范的字符串表示形式将 double 转换为 BigDecimal
- static BigDecimal valueOf(long val) //将 long 值转换为具有零标度的 BigDecimal
- static BigDecimal valueOf(long unscaledVal, int scale) //将 long 非标度值和 int 标度转换为 BigDecimal
- byte byteValueExact() //将此BigDecimal 转换为 byte,若BigDecimal含有小数部分或其值过大(超出byte),则抛出异常
- short shortValueExact() //将此BigDecimal 转换为 short,若BigDecimal含有小数部分或其值过大(超出short),则抛出异常
- int intValue() //将此BigDecimal 转换为 int,其行为类似于double想short的转换
- int intValueExact() //将此BigDecimal 转换为 int,若BigDecimal含有小数部分或其值过大(超出int),则抛出异常
- long longValue() //将此BigDecimal 转换为 long
- long longValueExact() //将此BigDecimal 转换为 long,若BigDecimal含有小数部分或其值过大(超出long),则抛出异常
- BigInteger toBigInteger() //将此BigDecimal 转换为 BigInteger
- BigInteger toBigIntegerExact() //将此BigDecimal 转换为 BigInteger,若BigDecimal含有小数部分,则抛出异常
- BigInteger unscaledValue() //返回其值为此BigDecimal 的非标度值的 BigInteger
- float floatValue() //将此 BigDecimal 转换为 float,其行为类似于double向float的转换
- double doubleValue() //将此 BigDecimal 转换为 double ,其行为类似于double向float的转换
- String toString() //返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法
- String toEngineeringString() //返回此 BigDecimal 的字符串表示形式,需要指数时,则使用工程计数法
- String toPlainString() //返回不带指数字段的此 BigDecimal 的字符串表示形式
JAVA API:https://docs.oracle.com/javase/7/docs/api/
时间: 2024-10-10 09:45:55