BigDecimal
类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
toString()
方法提供
BigDecimal
的规范表示形式。
BigDecimal
类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;否则,通过向该操作提供适当的
MathContext
对象,可以对已选择的精度和舍入模式执行计算。在任何情况下,可以为舍入控制提供八种
舍入模式
。使用此类(例如,
ROUND_HALF_UP
)中的整数字段来表示舍入模式已过时;应改为使用
RoundingMode
enum
(例如,
RoundingMode.HALF_UP
)的枚举值。
当为
MathContext
对象提供 0 的精度设置(例如,
MathContext.UNLIMITED
)时,算术运算是准确的,它们是不采用任何
MathContext
对象的算术方法。(这是第 5 版之前的版本支持的唯一行为。)为了计算准确结果,不使用附带 0 精度设置的
MathContext
对象的舍入模式设置,因此与该对象无关。在除法中,准确的商可能是一个无限长的十进制扩展;例如,1 除以 3 所得的商。如果商具有无穷的十进制扩展,但是指定了该操作返回准确结果,则抛出
ArithmeticException
。否则,像其他操作那样,返回除法运算的准确结果。
当精度设置不为 0 时, BigDecimal 算法的规则完全符合 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000( 7.4 节)中定义的算法的可选操作模式。与上述标准不同, BigDecimal 包括多种舍入模式,它们对于版本 5 以前的 BigDecimal 版本中的除法是强制性的。这些 ANSI 标准和 BigDecimal 规范之间的任何冲突都按照有利于 BigDecimal 的方式进行解决。
由于同一数值可以有不同的表示形式(具有不同的标度),因此运算和舍入的规则必须同时指定数值结果和结果表示形式中所用的标度。
一般情况下,当准确结果(在除法中,可能有无限多位)比返回的数值具有更多位数时,舍入模式和精度设置确定操作如何返回具有有限位数的结果。 首先, MathContext 的 precision 设置指定要返回的总位数;这确定了结果的 精度 。位数计数从准确结果的最左边的非零数字开始。舍入模式确定丢弃的尾部位数如何影响返回的结果。
对于所有算术运算符,运算的执行方式是,首先计算准确的中间结果,然后,使用选择的舍入模式将其舍入为精度设置(如有必要)指定的位数。如果不返回准确结果,则将丢弃准确结果的某些数位。当舍入增加了返回结果的大小时,前导数字“9”的进位传播可能会创建新的数位。例如,将值 999.9 舍入为三位数字,则在数值上等于一千,表示为 100×10 1 。在这种情况下,新的 "1" 是返回结果的前导数位。
除了逻辑的准确结果外,每种算术运算都有一个表示结果的首选标度。下表列出了每个运算的首选标度。
舍入之前,逻辑的准确中间结果的标度是该运算的首选标度。如果用
precision
位数无法表示准确的数值结果,则舍入会选择要返回的一组数字,并将该结果的标度从中间结果的标度减小到可以表示实际返回的
precision
位数的最小标度。如果准确结果可以使用最多
precision
个数字表示,则返回具有最接近首选标度的标度的结果表示形式。尤其是,通过移除结尾零并减少标度,可以用少于
precision
个数字来表示准确的可表示的商。例如,使用
floor
舍入模式将结果舍入为三个数字,
19/100 = 0.19 // integer=19, scale=2
21/110 = 0.190 // integer=190, scale=3
注意,对于加、减和乘,标度的缩减量将等于丢弃的准确结果的数字位置数。如果舍入导致进位传播创建一个新的高位,则当未创建新的数位时,会丢弃该结果的附加数字。
其他方法可能与舍入语义稍微不同。例如,使用 指定的算法 的 pow 方法得到的结果可能偶尔不同于舍入得到的算术结果,如最后一位有多个单位( ulp )。
可以通过两种类型的操作来处理
BigDecimal
的标度:标度/舍入操作和小数点移动操作。标度/舍入操作(
setScale
和
round
)返回
BigDecimal
,其值近似地(或精确地)等于操作数的值,但是其标度或精度是指定的值;即:它们会增加或减少对其值具有最小影响的存储数的精度。小数点移动操作(
movePointLeft
和
movePointRight
)返回从操作数创建的
BigDecimal
,创建的方法是按指定方向将小数点移动一个指定距离。
为了简洁明了起见,整个 BigDecimal 方法的描述中都使用了伪代码。伪代码表达式 (i + j) 是“其值为 BigDecimal i 加 BigDecimal j 的 BigDecimal ”的简写。伪代码表达式 (i == j) 是“当且仅当 BigDecimal i 表示与 BigDecimal j 相同的值时,则为 true ”的简写。可以类似地解释其他伪代码表达式。方括号用于表示特定的 BigInteger 和定义 BigDecimal 值的标度对;例如,[19, 2] 表示 BigDecimal 在数值上等于 0.19,标度是 2。
注:如果
BigDecimal
对象用作
SortedMap
中的键或
SortedSet
中的元素,则应特别小心,因为
BigDecimal
的
自然排序
与 equals 方法不一致
。有关更多信息,请参见
Comparable
、
SortedMap
或
SortedSet
。
当为任何输入参数传递
null
对象引用时,此类的所有方法和构造方法都将抛出
NullPointerException
。
将
BigDecimal
的字符数组表示形式转换为
BigDecimal
,接受与
BigDecimal(String)
构造方法相同的字符序列,同时允许指定子数组,并根据上下文设置进行舍入。
BigDecimal
(char[] in,
MathContext
mc)
将
BigDecimal
的字符数组表示形式转换为
BigDecimal
,接受与
BigDecimal(String)
构造方法相同的字符序列(根据上下文设置进行舍入)。
BigDecimal
(double val)
将
double
转换为
BigDecimal
,后者是
double
的二进制浮点值准确的十进制表示形式。
BigDecimal
(double val,
MathContext
mc)
将
double
转换为
BigDecimal
(根据上下文设置进行舍入)。
BigDecimal
(int val)
将
int
转换为
BigDecimal
。
BigDecimal
(int val,
MathContext
mc)
将
int
转换为
BigDecimal
(根据上下文设置进行舍入)。
BigDecimal
(long val)
将
long
转换为
BigDecimal
。
BigDecimal
(long val,
MathContext
mc)
将
long
转换为
BigDecimal
(根据上下文设置进行舍入)。
BigDecimal
(
String
val)
将
BigDecimal
的字符串表示形式转换为
BigDecimal
。
BigDecimal
(
String
val,
MathContext
mc)
将
BigDecimal
的字符串表示形式转换为
BigDecimal
,接受与
BigDecimal(String)
构造方法相同的字符串(按照上下文设置进行舍入)。
public static final int
ROUND_CEILING
BigDecimal(String)
构造方法相同的字符序列,同时允许指定子数组。
注意,如果字符数组中已经提供字符的序列,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快。
in
- 作为源字符的
char
数组。
offset
- 要检查的数组中的第一个字符。
len
- 要考虑的字符数。
NumberFormatException
- 如果
in
不是
BigDecimal
的有效表示形式,或者定义的子数组不完全在
in
中。
BigDecimal(String)
构造方法相同的字符序列,同时允许指定子数组,并根据上下文设置进行舍入。
注意,如果字符数组中已经提供字符的序列,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快。
in
- 作为源字符的
char
数组。
offset
- 要检查的数组中的第一个字符。
len
- 要考虑的字符数。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,且舍入模式为
UNNECESSARY
。
NumberFormatException
- 如果
in
不是
BigDecimal
的有效表示形式,或者定义的子数组不完全在
in
中。
BigDecimal(String)
构造方法相同的字符序列。
注意,如果字符序列已经可以作为一个字符数组使用,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快。
in
- 作为源字符的
char
数组。
NumberFormatException
- 如果
in
不是
BigDecimal
的有效表示形式。
BigDecimal(String)
构造方法相同的字符序列(根据上下文设置进行舍入)。
注意,如果字符序列已经可以作为一个字符数组使用,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快。
in
- 作为源字符的
char
数组。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,且舍入模式为
UNNECESSARY
。
NumberFormatException
- 如果
in
不是
BigDecimal
的有效表示形式。
该小数由小数点以及后跟的零或更多十进制数字组成。字符串必须至少包含整数或小数部分中的一个数字。由符号、整数和小数部分组成的数字称为 有效位数 。
指数由字符
'e'
(
'\u0065'
) 或
'E'
(
'\u0045'
) 以及后跟的一个或多个十进制数字组成。指数的值必须位于
Integer.MAX_VALUE
(
Integer.MIN_VALUE
+1) 和
Integer.MAX_VALUE
(包括)之间。
更正式地说,以下语法描述了此构造方法接受的字符串:
Character.isDigit(char)
对其返回
true
的任何字符,如 0、1、2……
返回的 BigDecimal 的标度将是小数部分中的数字位数,如果该字符串不包含小数点,则标度为零,这取决于对指数的调整;如果字符串包含一个指数,则从标度减去该指数。得到的标度值必须位于 Integer.MIN_VALUE 和 Integer.MAX_VALUE (包括)之间。
Character.digit(char, int)
集提供从字符到数字的映射,以转换成基数 10。该字符串不能包含任何额外字符(例如,空白)。
示例:
返回的
BigDecimal
的值等于
有效位数
× 10
指数
。对于左边的每个字符串,得到的表示形式 [
BigInteger
,
scale
] 显示在右边。
"0" [0,0]
"0.00" [0,2]
"123" [123,0]
"-123" [-123,0]
"1.23E3" [123,-1]
"1.23E+3" [123,-1]
"12.3E+7" [123,-6]
"12.0" [120,1]
"12.3" [123,1]
"0.00123" [123,5]
"-1.23E-12" [-123,14]
"1234.5E-4" [12345,5]
"0E+7" [0,-7]
"-0" [0,0]
注:对于不是
float
、
double
NaN 和 ±Infinity 的值,此构造方法与
Float.toString(float)
和
Double.toString(double)
返回的值兼容。这通常是将
float
或
double
转换为 BigDecimal 的首选方法,因为它不会遇到
BigDecimal(double)
构造方法的不可预知问题。
val
-
BigDecimal
的字符串表示形式。
NumberFormatException
- 如果
val
不是
BigDecimal
的有效表示形式。
BigDecimal(String)
构造方法相同的字符串(按照上下文设置进行舍入)。
val
-
BigDecimal
的字符串表示形式。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,且舍入模式为
UNNECESSARY
。
NumberFormatException
- 如果
val
不是 BigDecimal 的有效表示形式。
Double.toString(double)
方法,然后使用
BigDecimal(String)
构造方法,将
double
转换为
String
。要获取该结果,请使用
static
valueOf(double)
方法。
val
- 要转换为
BigDecimal
的
double
值。
NumberFormatException
- 如果
val
为无穷大或 NaN。
此构造方法的结果有一定的不可预知性,通常不建议使用它,请参见
BigDecimal(double)
构造方法下面的注释。
val
- 要转换为
BigDecimal
的
double
值。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,但是 RoundingMode 为 UNNECESSARY。
NumberFormatException
- 如果
val
为无穷大或 NaN。
val
- 要转换为
BigDecimal
的
BigInteger
值。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
unscaledVal
-
BigDecimal
的非标度值。
scale
-
BigDecimal
的标度。
unscaledVal
-
BigDecimal
的非标度值。
scale
-
BigDecimal
的标度。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
val
- 要转换为
BigDecimal
的
int
值。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
val
- 要转换为
BigDecimal
的
long
值。
mc
- 要使用的上下文。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
Double.toString(double)
方法提供的
double
规范的字符串表示形式将
double
转换为
BigDecimal
。
注:
这通常是将
double
(或
float
)转化为
BigDecimal
的首选方法,因为返回的值等于从构造
BigDecimal
(使用
Double.toString(double)
得到的结果)得到的值。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
相对于此遗留方法,应优先使用新的
divide(BigDecimal, int, RoundingMode)
方法。
divisor
- 此
BigDecimal
要除以的值。
scale
- 要返回的
BigDecimal
商的标度。
roundingMode
- 要应用的舍入模式。
ArithmeticException
- 如果
divisor
为零,则
roundingMode==ROUND_UNNECESSARY
和指定的标度不足以准确地表示相除的结果。
IllegalArgumentException
- 如果
roundingMode
不表示一个有效的舍入模式。
ROUND_UP
,
ROUND_DOWN
,
ROUND_CEILING
,
ROUND_FLOOR
,
ROUND_HALF_UP
,
ROUND_HALF_DOWN
,
ROUND_HALF_EVEN
,
ROUND_UNNECESSARY
divisor
- 此
BigDecimal
要除以的值。
scale
- 要返回的
BigDecimal
商的标度。
roundingMode
- 要应用的舍入模式。
ArithmeticException
- 如果
divisor
为零,则
roundingMode==RoundingMode.UNNECESSARY
和指定的标度不足以准确地表示相除的结果。
相对于此遗留方法,应优先使用新的
divide(BigDecimal, RoundingMode)
方法。
ArithmeticException
- 如果
divisor==0
或者
roundingMode==ROUND_UNNECESSARY
和
this.scale()
不足以准确地表示相除的结果。
IllegalArgumentException
- 如果
roundingMode
不表示一个有效的舍入模式。
ROUND_UP
,
ROUND_DOWN
,
ROUND_CEILING
,
ROUND_FLOOR
,
ROUND_HALF_UP
,
ROUND_HALF_DOWN
,
ROUND_HALF_EVEN
,
ROUND_UNNECESSARY
ArithmeticException
- 如果
divisor==0
或者
roundingMode==RoundingMode.UNNECESSARY
和
this.scale()
不足以准确地表示相除的结果。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
或
mc.precision == 0
,并且商值具有无穷的十进制扩展。
ArithmeticException
- 如果
divisor==0
ArithmeticException
- 如果
mc.precision
> 0,并且该结果需要的精度大于
mc.precision
。
余数由 this.subtract(this.divideToIntegralValue(divisor, mc).multiply(divisor)) 给出。注意,这不是模操作(结果可以为负)。
ArithmeticException
- 如果
divisor==0
ArithmeticException
- 如果结果不准确,但舍入模式为
UNNECESSARY
,或者
mc.precision
> 0,并且
this.divideToIntgralValue(divisor)
的结果要求的精度大于
mc.precision
。
divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
注意,如果同时需要整数商和余数,则此方法比分别使用 divideToIntegralValue 和 remainder 方法更快速,因为相除仅需执行一次。
divisor
- 此
BigDecimal
要相除的值和计算的余数。
ArithmeticException
- 如果
divisor==0
divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
,
remainder(java.math.BigDecimal, java.math.MathContext)
注意,如果同时需要整数商和余数,则此方法比分别使用 divideToIntegralValue 和 remainder 方法更快速,因为相除仅需执行一次。
divisor
- 此
BigDecimal
要相除的值和计算的余数。
mc
- 要使用的上下文。
ArithmeticException
- 如果
divisor==0
ArithmeticException
- 如果结果不准确,但舍入模式为
UNNECESSARY
,或者
mc.precision
> 0,并且
this.divideToIntgralValue(divisor)
的结果要求的精度大于
mc.precision
。
divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
,
remainder(java.math.BigDecimal, java.math.MathContext)
参数
n
必须在 0 到 999999999(包括)之间。
ZERO.pow(0)
返回
ONE
。
注意,未来版本可能会扩展此方法允许的指数范围。
MathContext
mc)
X3.274-1996 算法为:
ONE
(即使
this
为零),否则
ArithmeticException
- 如果该结果不准确,但是舍入模式为
UNNECESSARY
,或者
n
超出范围。
ArithmeticException
- 如果结果不准确,但是舍入模式为
UNNECESSARY
。
round(MathContext)
此方法的效果与
plus(MathContext)
方法的效果相同。
ArithmeticException
- 如果舍入模式为
UNNECESSARY
,并且
BigDecimal
操作要求进行舍入。
plus(MathContext)
newScale
- 要返回的
BigDecimal
值的标度。
roundingMode
- 要应用的舍入模式。
ArithmeticException
- 如果
roundingMode==UNNECESSARY
,并且指定的标度操作要求进行舍入。
RoundingMode
注意,由于 BigDecimal 对象是不可变的,此方法的调用 不会 导致初始对象被修改,这与使用名为 set X 变异字段 X 方法的常规约定相反。相反, setScale 返回具有适当标度的对象;返回的对象不一定是新分配的。
相对于此遗留方法,应优先使用新的
setScale(int, RoundingMode)
方法。
newScale
- 要返回的
BigDecimal
值的标度。
roundingMode
- 要应用的舍入模式。
ArithmeticException
- 如果
roundingMode==ROUND_UNNECESSARY
,并且指定的标度操作要求进行舍入。
IllegalArgumentException
- 如果
roundingMode
不表示一个有效的舍入模式。
ROUND_UP
,
ROUND_DOWN
,
ROUND_CEILING
,
ROUND_FLOOR
,
ROUND_HALF_UP
,
ROUND_HALF_DOWN
,
ROUND_HALF_EVEN
,
ROUND_UNNECESSARY
此调用通常用于增加标度,在这种情况下,可以保证存在指定标度和正确值的 BigDecimal 。如果调用方知道 BigDecimal 在其小数部分的结尾有足够多的零(即其整数值中的十的因子),则该调用也可用于减少标度,以允许重新标度,而不更改其值。
此方法返回与 setScale 的两个参数版本相同的结果,但是,为调用方省去了指定舍入模式的麻烦(舍入模式不影响结果)。
注意,由于 BigDecimal 对象是不可变的,因此此方法的调用 不会 导致初始对象被修改,这与使用名为 set X 变异字段 X 方法的常规约定相反。相反, setScale 返回具有适当标度的对象;返回的对象不一定是新分配的。
newScale
- 要返回的
BigDecimal
值的标度。
ArithmeticException
- 如果指定的标度操作要求进行舍入。
setScale(int, int)
,
setScale(int, RoundingMode)
Comparable
<
BigDecimal
>
中的
compareTo
val
- 将此
BigDecimal
与之比较的
BigDecimal
。
compareTo
不同,仅当两个
BigDecimal
对象的值和标度都相等时,此方法才认为它们相等(因此通过此方法进行比较时,2.0 不等于 2.00)。
Object
中的
equals
x
- 将与此
BigDecimal
进行比较的
Object
。
compareTo(java.math.BigDecimal)
,
hashCode()
Object
中的
hashCode
equals(Object)
根据以下步骤可创建 BigDecimal 的标准的规范化字符串形式:首先,使用不带前导零的字符 '0' 至 '9' (如果其值为零,则使用单个 '0' 字符)将 BigDecimal 的非标度值的绝对值转换为以十为基数的字符串。
其次,计算 调整的指数 ;这是无效的标度,加上转换的非标度值中的字符数减 1。即: -scale+(ulength-1) ,其中 ulength 是十进制数字中非标度值的绝对值的长度(其 精度 )。
如果该标度大于或等于零,并且调整的指数大于或等于 -6 ,则在不使用指数记数法的情况下将该数转换为字符形式。在这种情况下,如果标度为零,则不添加小数点,如果标度为正数,则插入小数点,且标度指定了小数点右边的字符个数。必要时,将字符 '0' 添加到转换的非标度值的左边。如果插入后小数点前面没有字符,则以传统字符 '0' 为前缀。
否则(即:如果标度为负数,或者调整的指数小于 -6 ),使用指数记数法将该数转换为字符形式。在这种情况下,如果转换后的 BigInteger 多于一位数,则小数点插入在第一个数字之后。然后,将字符形式的指数作为转换的非标度值(也许具有插入的小数点)的后缀;这包含字母 'E' 和直接跟在其后的转换为字符形式的调整指数。后者的基数为十,使用的字符是 '0' 到 '9' ,没有前导零,并且,如果调整的指数为负数,则总是以符号字符 '-' ( '\u002D' ) 为前缀,否则以 '+' ( '\u002B' ) 为前缀。
最后,如果非标度值小于零,则整个字符串以减号 '-' ( '\u002D' ) 为前缀。如果非标度值为零或正数,则不使用符号字符作为前缀。
对于左边的每个表示形式 [ unscaled value , scale ],得到的字符串显示在右边。 [123,0] "123" [-123,0] "-123" [123,-1] "1.23E+3" [123,-3] "1.23E+5" [123,1] "12.3" [123,5] "0.00123" [123,10] "1.23E-8" [-123,12] "-1.23E-10"
BigDecimal(String)
构造方法将该字符串表示形式转换为
BigDecimal
,则将恢复初始值。
NumberFormat
类及其子类可以处理区分语言环境的数的格式化和分析。
toEngineeringString()
方法可用于在工程计数法中表示带有指数的数。
setScale
方法可用于对
BigDecimal
进行舍入,使其小数点后的位数为已知位数。
返回如
toString()
方法中所描述的表示
BigDecimal
的字符串,不包括使用指数记数法的情况,将十的幂调整为三的倍数(工程记数法),这样,非零值的整数部分的范围是 1 到 999。如果对零值使用指数记数法,则使用小数点和小数的一(或二)个零数字,以便保留零值的标度。注意,与
toString()
的输出不同,如果使用
string constructor
将输出字符串转换为
BigDecimal
,则此方法的输出
不
保证恢复此
BigDecimal
的相同 [integer, scale] 对。此方法满足以下较弱约束,即产生的结果在数值上始终等于将字符串构造方法应用到方法的输出得到的结果。
public
String
toPlainString
()
toBigIntegerExact()
方法。
public long
longValue
()
Number
中的
longValue
ArithmeticException
- 如果
this
具有非零小数部分,或者不适合用
long
表示。
Number
中的
intValue
ArithmeticException
- 如果
this
具有非零小数部分,或者不适合用
int
表示。
ArithmeticException
- 如果
this
具有非零小数部分,或者不适合用
short
表示。
ArithmeticException
- 如果
this
具有非零小数部分,或者不适合用
byte
表示。
Float.NEGATIVE_INFINITY
或
Float.POSITIVE_INFINITY
。注意,即使在返回值为有限值的情况下,此转换也可能丢失关于
BigDecimal
值精度的信息。
Number
中的
floatValue
Double.NEGATIVE_INFINITY
或
Double.POSITIVE_INFINITY
。注意,即使在返回值为有限值的情况下,此转换也可能丢失关于
BigDecimal
值精度的信息。
Number
中的
doubleValue