如果为零或正数,则比例是小数点右侧的位数。
如果是负数,则将数字的未缩放值乘以10来表示比例的否定。
因此,
(unscaledValue × 10
-scale
)
代表的
BigDecimal
值为
(unscaledValue × 10
-scale
)
。
BigDecimal
类提供算术,比例操作,舍入,比较,散列和格式转换的操作。
该
toString()
方法提供的规范表示
BigDecimal
。
BigDecimal
类使用户可以完全控制舍入行为。
如果未指定舍入模式且无法表示确切结果,则抛出异常;
否则,通过向操作提供适当的
MathContext
对象,可以执行计算到选定的精度和舍入模式。
在任何一种情况下,都提供八种
舍入模式
来控制舍入。
不推荐使用此类中的整数字段(例如
ROUND_HALF_UP
)来表示舍入模式;
应改为使用
RoundingMode
枚举
(例如
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
包括许多舍入模式,这些模式在
BigDecimal
之前的
BigDecimal
版本中是必需的。这些ANSI标准和
BigDecimal
规范之间的任何冲突都有利于
BigDecimal
。
由于相同的数值可以具有不同的表示(具有不同的比例),因此算术和舍入的规则必须指定数值结果和结果表示中使用的比例。
通常,舍入模式和精度设置确定当精确结果具有比返回的位数更多的数字(在除法和平方根的情况下可能无限多)时,操作如何以有限数量的数字返回结果。
首先,要返回的总位数由
MathContext
的
precision
设置指定;
这决定了结果的
精确度
。
数字计数从精确结果的最左边非零数字开始。
舍入模式确定任何丢弃的尾随数字如何影响返回的结果。
对于所有算术运算符,执行操作就像首先计算精确的中间结果一样,然后使用选定的舍入模式舍入到精度设置(如果需要)指定的位数。
如果未返回确切结果,则丢弃确切结果的某些数字位置。
当舍入增加返回结果的幅度时,可以通过传播到前导“9”数字的进位来创建新的数字位置。
例如,将值999.9舍入到三位数四舍五入将在数字上等于一千,表示为100×10
1
。
在这种情况下,新的“1”是返回结果的前导数字位置。
除了逻辑精确结果之外,每个算术运算具有用于表示结果的优选比例。
每种操作的首选比例列于下表中。
Preferred Scales for Results of Arithmetic Operations Operation Preferred Scale of Result Add max(addend.scale(), augend.scale()) Subtract max(minuend.scale(), subtrahend.scale()) Multiply multiplier.scale() + multiplicand.scale() Divide dividend.scale() - divisor.scale() Square root radicand.scale()/2
这些尺度是返回精确算术结果的方法所使用的尺度;
除了精确的除法可能必须使用更大的比例,因为确切的结果可能有更多的数字。
例如,
1/32
是
0.03125
。
在舍入之前,逻辑确切中间结果的比例是该操作的首选比例。
如果精确的数值结果不能用
precision
数字表示,则舍入选择要返回的数字集,并将结果的比例从中间结果的比例减小到可以表示实际返回的
precision
数字的最小比例。
如果确切结果可以用最多
precision
数字表示,则返回具有最接近首选比例的比例的结果的表示。
特别地,通过去除尾随零并减小比例,可以用少于
precision
数字来表示精确表示的商。
例如,使用
floor
舍入模式舍入到三位数,
19/100 = 0.19 // integer=19, scale=2
但
21/110 = 0.190 // integer=190, scale=3
注意,对于加,减和乘,缩放的减少将等于被丢弃的精确结果的数字位置的数量。
如果舍入导致进位传播创建新的高位数字位置,则与没有创建新的数字位置时相比,将丢弃结果的附加数字。
其他方法可能具有略微不同的舍入语义。
例如,使用
specified algorithm
的
pow
方法的结果有时可能与舍入的数学结果有所不同,最后一个位置是一个
ulp
。
提供了两种类型的操作来操纵
BigDecimal
比例:缩放/舍入操作和小数点运动操作。
缩放/舍入操作(
setScale
和
round
)返回
BigDecimal
其值大约(或精确)等于操作数的值,但其标度或精度是指定值;
也就是说,它们会增加或减少存储数字的精度,而对其值的影响最小。
小数点运动操作(
movePointLeft
和
movePointRight
)通过将小数点沿指定方向移动指定距离来返回从操作数创建的
BigDecimal
。
为了简洁和清楚起见,在整个
BigDecimal
方法的描述中使用伪代码。
的伪代码表达
(i + j)
为速记“一个
BigDecimal
,它的值是,的
BigDecimal
i
添加到的
BigDecimal
j
”。
的伪代码表达
(i == j)
被简写“
true
当且仅当所述
BigDecimal
i
表示相同的值
BigDecimal
j
”。
其他伪代码表达式的解释类似。
方括号用于表示定义
BigDecimal
值的特定
BigInteger
和比例对;
例如[
BigDecimal
]是数字上等于0.19的
BigDecimal
,其标度为2。
当为任何输入参数传递
null
对象引用时,此类的所有方法和构造函数都会抛出
NullPointerException
。
API Note:
如果
BigDecimal
对象用作
BigDecimal
中的键或
SortedSet
中的
元素,
则应谨慎行事,
因为
BigDecimal
的
自然顺序
与equals不一致
。
见
Comparable
,
SortedMap
或
SortedSet
获取更多信息。
从以下版本开始:
另请参见:
BigInteger
,
MathContext
,
RoundingMode
,
SortedMap
,
SortedSet
,
Serialized Form
舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下,向着偶邻居舍入。
如果丢弃的分数左边的数字是奇数,则表现为
ROUND_HALF_UP
;
如果它是偶数,则表现为
ROUND_HALF_DOWN
。
请注意,这是在一系列计算中重复应用时最小化累积误差的舍入模式。
另请参见:
常数字段值
BigDecimal
public BigDecimal(String val)
将
BigDecimal
的字符串表示
BigDecimal
转换为
BigDecimal
。
字符串表示由可选符号
'+'
(
'\u002B'
)或
'-'
(
'\u002D'
)组成,后跟一个零或更多十进制数字(“整数”)的序列,可选地后跟一个分数,可选地后跟一个指数。
该分数由小数点后跟零个或多个十进制数字组成。
该字符串必须包含整数或小数中的至少一个数字。
由符号,整数和分数形成的数字称为
有效数
。
指数由字符
'e'
(
'\u0065'
)或
'E'
(
'\u0045'
)后跟一个或多个十进制数字组成。
指数的值必须介于 -
Integer.MAX_VALUE
(
Integer.MIN_VALUE
+1)和
Integer.MAX_VALUE
之间
。
更正式地说,这个构造函数接受的字符串由以下语法描述:
返回的
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]
API Note:
对于
float
和
double
NaN和±Infinity以外的值,此构造函数与
Float.toString(float)
和
Double.toString(double)
返回的值兼容。
这通常是将
float
或
double
转换为BigDecimal的首选方法,因为它不会受到
BigDecimal(double)
构造函数的不可预测性的
影响
。
val
-
val
字符串表示
BigDecimal
。
NumberFormatException
-如果
val
不是的有效表示
BigDecimal
。
BigDecimal
public BigDecimal(double val)
将
double
转换为
BigDecimal
,它是
double
的二进制浮点值的精确十进制表示形式。
返回的
BigDecimal
是最小值,使得
(10
scale
× val)
是整数。
这个构造函数的结果可能有点不可预测。
有人可能会认为在Java中编写
new BigDecimal(0.1)
会创建一个
BigDecimal
,它正好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。
这是因为0.1不能精确地表示为
double
(或者,就此而言,作为任何有限长度的二进制分数)。
因此,正在
被
传递给构造的值不是正好等于0.1,虽然表面上。
另一方面,
String
构造函数是完全可预测的:编写
new BigDecimal("0.1")
会创建一个
BigDecimal
,它
正好
等于0.1,正如人们所期望的那样。
因此,通常建议优先使用
String constructor
。
当
double
必须用作源为
BigDecimal
,请注意,此构造提供了一个精确的转换;
它没有给出相同的结果转换
double
为
String
使用
Double.toString(double)
方法,然后使用
BigDecimal(String)
构造。
要获得该结果,请使用
static
valueOf(double)
方法。
divide
@Deprecated(since="9")
public BigDecimal divide(BigDecimal divisor,
int scale,
int roundingMode)
Deprecated.
The method
divide(BigDecimal, int, RoundingMode)
should be used in preference to this legacy method.
返回
BigDecimal
其值为
(this / divisor)
,其比例为指定的比例。
如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。
divisor
-
divisor
此
BigDecimal
值。
scale
- 要返回的
BigDecimal
商数的比例。
roundingMode
- 应用舍入模式。
this / divisor
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
divide
public BigDecimal divide(BigDecimal divisor,
int scale,
RoundingMode roundingMode)
返回
BigDecimal
其值为
(this / divisor)
,其比例为指定的比例。
如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。
divisor
- 此
BigDecimal
分配值。
scale
- 要返回的商品的规模
BigDecimal
。
roundingMode
- 要应用的舍入模式。
this / divisor
ArithmeticException
- 如果
divisor
为零,
roundingMode==RoundingMode.UNNECESSARY
,并且指定的比例不足以完全表示除法的结果。
从以下版本开始:
divide
@Deprecated(since="9")
public BigDecimal divide(BigDecimal divisor,
int roundingMode)
Deprecated.
The method
divide(BigDecimal, RoundingMode)
should be used in preference to this legacy method.
返回
BigDecimal
其值为
(this / divisor)
,其比例为
this.scale()
。
如果必须执行舍入以生成具有给定比例的结果,则应用指定的舍入模式。
divisor
- 此
BigDecimal
分配值。
roundingMode
- 要应用的舍入模式。
this / divisor
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
divide
public BigDecimal divide(BigDecimal divisor)
返回
BigDecimal
其值为
(this / divisor)
,其首选比例为
(this.scale() - divisor.scale())
;
如果无法表示确切的商(因为它具有非终止的十进制扩展),则抛出
ArithmeticException
。
divisor
-
divisor
此
BigDecimal
值。
this / divisor
ArithmeticException
- 如果确切的商没有终止十进制扩展
从以下版本开始:
divideToIntegralValue
public BigDecimal divideToIntegralValue(BigDecimal divisor)
返回
BigDecimal
其值是
(this / divisor)
舍入的商
(this / divisor)
的整数部分。
结果的优选比例是
(this.scale() - divisor.scale())
。
divisor
- 此
BigDecimal
分配值。
this / divisor
的整数部分。
ArithmeticException
- 如果是
divisor==0
从以下版本开始:
divideToIntegralValue
public BigDecimal divideToIntegralValue(BigDecimal divisor,
MathContext mc)
返回
BigDecimal
,其值是整数部分
(this / divisor)
。
由于精确商的整数部分不依赖于舍入模式,因此舍入模式不会影响此方法返回的值。
结果的优选比例是
(this.scale() - divisor.scale())
。
一个
ArithmeticException
如果准确的商值的整数部分需要超过抛出
mc.precision
数字。
divisor
- 此
BigDecimal
分配值。
mc
- 要使用的上下文。
this / divisor
的整数部分。
ArithmeticException
- 如果
divisor==0
ArithmeticException
- 如果
mc.precision
> 0且结果要求精度超过
mc.precision
位数。
从以下版本开始:
remainder
public BigDecimal remainder(BigDecimal divisor)
返回
BigDecimal
其值为
(this % divisor)
。
其余部分由
this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
给出。
请注意,这
不是
模运算(结果可能是负数)。
divisor
- 此
BigDecimal
分配值。
this % divisor
。
ArithmeticException
- 如果
divisor==0
从以下版本开始:
返回
BigDecimal
其值为
(this % divisor)
,根据上下文设置进行舍入。
MathContext
设置会影响用于计算余数的隐式除法。
余数计算本身按照定义是精确的。
因此,余数可能包含超过
mc.getPrecision()
数字。
其余部分由
this.subtract(this.divideToIntegralValue(divisor, mc).multiply(divisor))
给出。
请注意,这不是模运算(结果可能是负数)。
divisor
- 此
BigDecimal
分配值。
mc
- 要使用的上下文。
this % divisor
,必要时四舍五入。
ArithmeticException
- 如果是
divisor==0
ArithmeticException
- 如果结果不准确但舍入模式为
UNNECESSARY
,或
mc.precision
> 0且结果为
this.divideToIntgralValue(divisor)
需要超过
mc.precision
位数的精度。
从以下版本开始:
另请参见:
divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
divideAndRemainder
public BigDecimal[] divideAndRemainder(BigDecimal divisor)
返回一个两元件
BigDecimal
阵列含有的结果
divideToIntegralValue
,随后的结果
remainder
上的两个操作数。
请注意,如果需要整数商和余数,则此方法比分别使用
divideToIntegralValue
和
remainder
方法更快,因为除法只需执行一次。
divisor
- 要分割此
BigDecimal
值,并计算余数。
BigDecimal
数组:商(
divideToIntegralValue
的结果)是初始元素,余数是最终元素。
ArithmeticException
- 如果
divisor==0
从以下版本开始:
另请参见:
divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
,
remainder(java.math.BigDecimal, java.math.MathContext)
divideAndRemainder
public BigDecimal[] divideAndRemainder(BigDecimal divisor,
MathContext mc)
返回一个两元件
BigDecimal
阵列含有的结果
divideToIntegralValue
,随后的结果
remainder
上与根据上下文设置进行舍入计算出的两个操作数。
请注意,如果需要整数商和余数,则此方法比分别使用
divideToIntegralValue
和
remainder
方法更快,因为除法只需执行一次。
divisor
- 要分割此
BigDecimal
值,并计算余数。
mc
- 要使用的上下文。
BigDecimal
数组:商(
divideToIntegralValue
的结果)是初始元素,余数是最终元素。
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)
返回
this
平方根的
this
并根据上下文设置进行舍入。
返回结果的首选比例等于
this.scale()/2
。
返回结果的值始终在所讨论精度的精确十进制值的一个ulp内。
如果舍入模式为
HALF_UP
,
HALF_DOWN
,或
HALF_EVEN
,结果是二分之一精确十进制值的ulp内。
特殊情况:
数字上等于
ZERO
的数字的
ZERO
在数值上等于
ZERO
,根据上述一般规则具有优选的标度。
特别是,
ZERO
,
ZERO.sqrt(mc).equals(ZERO)
是任何真正
MathContext
作为参数。
ArithmeticException
- 如果
(mc.getRoundingMode()==RoundingMode.UNNECESSARY
)并且确切的结果不能适合
mc.getPrecision()
位数。
从以下版本开始:
另请参见:
BigInteger.sqrt()
返回
BigDecimal
其值为
(this
n
)
。
当前实现使用ANSI标准X3.274-1996中定义的核心算法,并根据上下文设置进行舍入。
通常,返回的数值在所选精度的精确数值的两个ulps范围内。
请注意,将来的版本可能会使用不同的算法,其允许的误差范围减小,允许的指数范围增加。
X3.274-1996算法是:
如果是,则抛出
ArithmeticException
异常
abs(n) > 999999999
mc.precision == 0
和
n < 0
mc.precision > 0
和
n
具有超过
mc.precision
十进制数字
如果
n
为零,即使
n
为零,
也会
返回
this
,否则
如果
n
为正,则通过重复平方技术将结果计算到单个累加器中。
与蓄能器的各个乘法中使用相同的数学上下文设置为
mc
除了一个精度提高到
mc.precision + elength + 1
其中
elength
是十进制数字的数量
n
。
如果
n
为负数,则计算结果,好像
n
为正数;
然后使用上面指定的工作精度将该值分成一个。
然后将正面或负面情况的最终值四舍五入到目标精度。
RoundingMode
roundingMode)
返回
BigDecimal
其比例为指定值,其未缩放值通过将此
BigDecimal
值乘以或除以适当的10的幂来确定,以保持其总值。
如果通过操作减小比例,则必须将未缩放的值除以(而不是相乘),并且可以改变该值;
在这种情况下,指定的舍入模式应用于除法。
API Note:
由于BigDecimal对象是不可变的,因此调用此方法
不会
导致原始对象被修改,这与通常使用名为
set
X
mutate字段
X
方法的惯例相反。
而是,
setScale
返回具有适当比例的对象;
返回的对象可能会或可能不会被新分配。
newScale
- 要返回的
BigDecimal
值的比例。
roundingMode
- 要应用的舍入模式。
BigDecimal
其比例为指定值,其未缩放值是通过将此
BigDecimal
值乘以或除以适当的10的幂来确定,以维持其总值。
ArithmeticException
- 如果
roundingMode==UNNECESSARY
和指定的缩放操作需要舍入。
从以下版本开始:
另请参见:
RoundingMode
setScale
@Deprecated(since="9")
public BigDecimal setScale(int newScale,
int roundingMode)
Deprecated.
The method
setScale(int, RoundingMode)
should be used in preference to this legacy method.
返回
BigDecimal
其比例为指定值,其未缩放值通过将此
BigDecimal
值乘以或除以适当的10的幂来确定,以保持其总值。
如果通过操作减小比例,则必须将未缩放的值除以(而不是相乘),并且可以改变该值;
在这种情况下,指定的舍入模式应用于除法。
API Note:
由于BigDecimal对象是不可变的,因此调用此方法
不会
导致原始对象被修改,这与通常使用名为
set
X
mutate字段
X
方法的惯例相反。
而是,
setScale
返回具有适当比例的对象;
返回的对象可能会或可能不会被新分配。
newScale
- 要返回的
BigDecimal
值的比例。
roundingMode
- 要应用的舍入模式。
BigDecimal
其比例是指定值,其未缩放值是通过将此
BigDecimal
值乘以或除以适当的10的幂来确定的,以保持其总值。
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
setScale
public BigDecimal setScale(int newScale)
返回
BigDecimal
其标度为指定值,其值在数值上等于此
BigDecimal
。
如果不可能,则抛出
ArithmeticException
。
此调用通常用于增加比例,在这种情况下,可以保证存在指定比例的
BigDecimal
和正确的值。
如果调用者知道
BigDecimal
在其小数部分的末尾具有足够多的零(即,其整数值为10的因子)以允许重新缩放而不改变其值,则该调用也可用于减小比例。
此方法返回与
setScale
的双参数版本相同的结果,但在调用者不相关的情况下保存指定舍入模式的麻烦。
API Note:
由于
BigDecimal
对象是不可变的,因此调用此方法
不会
导致原始对象被修改,这与通常使用名为
set
X
mutate字段
X
方法的惯例相反。
而是,
setScale
返回具有适当比例的对象;
返回的对象可能会或可能不会被新分配。
newScale
- 要返回的
BigDecimal
值的比例。
BigDecimal
其范围是指定值,其未缩放值是通过将此
BigDecimal
值乘以或除以适当的10的幂来确定的,以保持其整体值。
ArithmeticException
- 如果指定的缩放操作需要舍入。
另请参见:
setScale(int, int)
,
setScale(int, RoundingMode)
movePointLeft
public BigDecimal movePointLeft(int n)
返回一个
BigDecimal
,相当于这个小数点向左移动
n
位置。
如果
n
为非负数,则该呼叫仅将
n
添加到比例。
如果
n
为负数,则该呼叫相当于
movePointRight(-n)
。
此次
BigDecimal
返回的
BigDecimal
值为
(this × 10
-n
)
,比例为
max(this.scale()+n, 0)
。
n
- 向左移动小数点的位数。
BigDecimal
,相当于这个小数点
n
位置。
ArithmeticException
- 如果规模溢出。
movePointRight
public BigDecimal movePointRight(int n)
返回一个
BigDecimal
,相当于这个小数点向右移动了
n
位置。
如果
n
为非负数,则该调用
n
比例中减去
n
。
如果
n
为负数,则该调用等效于
movePointLeft(-n)
。
此次
BigDecimal
返回的
BigDecimal
值为
(this × 10
n
)
,比例为
max(this.scale()-n, 0)
。
n
- 向右移动小数点的位置数。
BigDecimal
相当于这一个小数点移动到右边的
n
位置。
ArithmeticException
- 如果比例溢出。
scaleByPowerOfTen
public BigDecimal scaleByPowerOfTen(int n)
返回其数值等于(
this
* 10
n
)的BigDecimal。
结果的比例是
(this.scale() - n)
。
n
- 十分之一的指数幂
一个BigDecimal,其数值等于(
this
* 10
ArithmeticException
- 如果比例超出32位整数的范围。
从以下版本开始:
stripTrailingZeros
public BigDecimal stripTrailingZeros()
返回
BigDecimal
,它在数值上等于此值,但从表示中删除了任何尾随零。
例如,从汽提尾随零
BigDecimal
值
600.0
,它有[
BigInteger
,
scale
]组件等于[6000,1],产率
6E2
与[
BigInteger
,
scale
]组分等于[6,-2]。
如果此BigDecimal在数值上等于零,则返回
BigDecimal.ZERO
。
在数字上相等的
BigDecimal
,删除了任何尾随零。
从以下版本开始:
将此
BigDecimal
与指定的
BigDecimal
。
通过此方法,两个值相等但具有不同比例(如2.0和2.00)的
BigDecimal
对象被视为相等。
对于六个布尔比较运算符(<,==,>,> =,!=,<=)中的每一个,优先考虑该方法。
建议执行这些比较的习惯用法是:
(x.compareTo(y)
<
op
>
0)
,其中<
op
>是六个比较运算符之一。
Specified by:
compareTo
,界面
Comparable
<
BigDecimal
>
val
-
BigDecimal
这个
BigDecimal
要比较。
-1,0或1,因为该
BigDecimal
在数值上小于,等于或大于
val
。
如果需要指数,则使用科学计数法返回此
BigDecimal
的字符串表示形式。
BigDecimal
标准规范字符串形式的创建方式如下所示:首先,使用字符
'0'
到
'9'
将
BigDecimal
的未缩放值的
BigDecimal
转换为
BigDecimal
字符串,不带前导零(除非是它的值为零,在这种情况下使用单个
'0'
字符)。
接下来,计算
调整后的指数
;
这是否定的比例,加上未转换的非标定值中的字符数,减去一个。
也就是
-scale+(ulength-1)
,其中
ulength
是十进制数字(其
精度
)中未缩放值的绝对值的长度。
如果标度大于或等于零且调整后的指数大于或等于
-6
,则该数字将转换为字符形式,而不使用指数表示法。
在这种情况下,如果比例为零,则不添加小数点,如果比例为正,则将插入小数点,并使用比例指定小数点右侧的字符数。
'0'
必要,将
'0'
字符添加到转换后的非缩放值的左侧。
如果在插入后没有字符位于小数点之前,
'0'
常规的
'0'
字符作为前缀。
否则(即,如果比例为负,或调整后的指数小于
-6
),则使用指数表示法将数字转换为字符形式。
在这种情况下,如果转换的
BigInteger
具有多个数字,则在第一个数字后插入小数点。
然后以转换的非标定值(可能带有插入的小数点)为字符形式的指数后缀;
这包括字母
'E'
紧接着调整后的指数转换为字符形式。
后者使用字符
'0'
到
'9'
,没有前导零,并且如果调整后的指数为负,则始终以符号字符
'-'
(
'\u002D'
)作为前缀,否则为
'+'
(
'\u002B'
)。
最后,如果未缩放的值小于零,则整个字符串以减号字符
'-'
(
'\u002D'
)作为前缀。
如果未缩放的值为零或正数,则不会为符号字符添加前缀。
对于左侧的每个表示[未
缩放值
,
比例
],结果字符串显示在右侧。
[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
值与此转换的结果之间存在一对一映射。
也就是说,每个可区分的
BigDecimal
值(未缩放的值和比例)由于使用
toString
而具有唯一的字符串表示
toString
。
如果该字符串表示转换回
BigDecimal
使用
BigDecimal(String)
构造,则原始值将被回收。
为给定数字生成的字符串始终相同;
它不受语言环境的影响。
这意味着它可以用作交换十进制数据的规范字符串表示,或者用作Hashtable的键等。区域设置敏感的数字格式和解析由
NumberFormat
类及其子类处理。
toEngineeringString()
方法可用于以工程符号表示具有指数的数字,并且
setScale
方法可用于舍入
BigDecimal
因此它在小数点后具有已知的位数。
使用由
Character.forDigit
提供的数字到字符映射。
toEngineeringString
public String toEngineeringString()
如果需要指数,则使用工程符号返回此
BigDecimal
的字符串表示形式。
返回表示一个字符串
BigDecimal
如在所描述的
toString()
方法,不同之处在于,如果使用指数表示法,10的功率被调整为3(工程符号)的倍数,使得非零值的整数部分将在范围1到999.如果指数表示法用于零值,则使用小数点和一个或两个小数零位数,以便保留零值的比例。
注意,与输出
toString()
,这种方法的输出是
不能
保证恢复相同[整数,标度]对本的
BigDecimal
如果输出串转换回一
BigDecimal
使用
string constructor
。
此方法的结果满足较弱的约束,即通过将字符串构造函数应用于方法的输出,始终产生数值相等的结果。
如果需要指数,则使用工程符号表示此
BigDecimal
字符串表示形式。
从以下版本开始:
返回此
BigDecimal
的字符串表示形式,不带指数字段。
对于具有正标度的值,小数点右侧的位数用于表示标度。
对于具有零或负标度的值,生成结果字符串,就好像该值被转换为具有零标度的数值相等的值,并且好像零标度值的所有尾随零都存在于结果中。
如果未缩放的值小于零,则整个字符串以减号字符' - '(
'\u002D'
)作为前缀。
如果未缩放的值为零或正数,则不会为符号字符添加前缀。
请注意,如果将此方法的结果传递给
string constructor
,则必须仅恢复此
BigDecimal
的数值;
新
BigDecimal
的表示可能有不同的比例。
特别是,如果此
BigDecimal
具有负标度,则由此方法生成的字符串在由字符串构造函数处理时将具有零标度。
(此方法的行为与1.4及更早版本中的
toString
方法类似。)
没有指数字段的
BigDecimal
的字符串表示形式。
从以下版本开始:
另请参见:
toString()
,
toEngineeringString()
将
BigDecimal
转换为
BigInteger
。
此转换类似于从
基本收缩转换
double
到
long
如
The Java™ Language Specification
定义:此的任何小数部分
BigDecimal
将被丢弃。
请注意,此转换可能会丢失有关
BigDecimal
值精度的信息。
要在转换不精确时抛出异常(换句话说,如果丢弃非零小数部分),请使用
toBigIntegerExact()
方法。
BigDecimal
转换为
BigInteger
。
See
The Java™ Language Specification
:
5.1.3缩小原始转换
toBigIntegerExact
public BigInteger toBigIntegerExact()
将此
BigDecimal
转换为
BigInteger
,检查是否丢失了信息。
如果此
BigDecimal
具有非零小数部分,则抛出异常。
BigDecimal
转换为
BigInteger
。
ArithmeticException
- 如果
this
具有非零小数部分。
从以下版本开始:
将
BigDecimal
转换为
long
。
此转换类似于从
基本收缩转换
double
到
short
如
The Java™ Language Specification
定义:此的任何小数部分
BigDecimal
将被丢弃,并且如果产生的“
BigInteger
”太大而不适合在一个
long
,仅低阶64返回位。
请注意,此转换可能会丢失有关此
BigDecimal
值的总体幅度和精度的信息,并返回具有相反符号的结果。
Specified by:
longValue
在类
Number
BigDecimal
兑换成
long
。
See
The Java™ Language Specification
:
5.1.3缩小原始转换
将
BigDecimal
转换为
int
。
此转换类似于从
基本收缩转换
double
到
short
如
The Java™ Language Specification
定义:此的任何小数部分
BigDecimal
将被丢弃,并且如果产生的“
BigInteger
”太大而不适合用
int
,只有低32返回位。
请注意,此转换可能会丢失有关此
BigDecimal
值的总体幅度和精度的信息,并返回具有相反符号的结果。
Specified by:
intValue
,类
Number
BigDecimal
转换为
int
。
See
The Java™ Language Specification
:
5.1.3缩小原始转换
将
BigDecimal
转换为
float
。
这种转换是类似于从
基本收缩转换
double
到
float
如
The Java™ Language Specification
定义:如果此
BigDecimal
有太大的幅度来表示作为
float
,它会被转换为
Float.NEGATIVE_INFINITY
或
Float.POSITIVE_INFINITY
适当。
请注意,即使返回值是有限的,此转换也可能会丢失有关
BigDecimal
值精度的信息。
Specified by:
floatValue
在类
Number
BigDecimal
转换为
float
。
See
The Java™ Language Specification
:
5.1.3缩小原始转换
将
BigDecimal
转换为
double
。
这种转换是类似于从
基本收缩转换
double
到
float
如
The Java™ Language Specification
定义:如果此
BigDecimal
有太大的幅度表示为
double
,它会被转换为
Double.NEGATIVE_INFINITY
或
Double.POSITIVE_INFINITY
适当。
请注意,即使返回值是有限的,此转换也可能会丢失有关
BigDecimal
值精度的信息。
Specified by:
doubleValue
在类
Number
BigDecimal
转换为
double
。
See
The Java™ Language Specification
:
5.1.3缩小原始转换
返回此
BigDecimal
的ulp(最后一个单位)的
BigDecimal
。
非零
BigDecimal
值的ulp是该值与
BigDecimal
值之间的正距离,该值接着在数量上具有相同的位数。
零值的ulp在数值上等于1,比例为
this
。
结果以与
this
相同的比例存储,因此零和非零值的结果等于
[1, this.scale()]
。
ulp的大小
从以下版本开始: