[Android.Runtime.Register("java/math/BigDecimal", DoNotGenerateAcw=true)]
public class BigDecimal : Java.Lang.Number, IDisposable, Java.Interop.IJavaPeerable, Java.Lang.IComparable
[<Android.Runtime.Register("java/math/BigDecimal", DoNotGenerateAcw=true)>]
type BigDecimal = class
inherit Number
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IComparable
BigDecimal
不可变的任意精度有符号十进制数。 由
BigDecimal
任意精度整数
#unscaledValue () 未缩放值
和 32 位整数
#scale () 刻度
组成。 如果为零或正数,则刻度是小数点右侧的位数。 如果为负数,则数字的未缩放值将乘以 10 到刻度求反的幂。 因此
(unscaledValue × 10<sup>-scale</sup>)
, 表示
BigDecimal
的数字的值为 。
类
BigDecimal
提供用于算术、缩放操作、舍入、比较、哈希和格式转换的操作。 方法
#toString
提供 的规范表示形式
BigDecimal
。
类
BigDecimal
可让用户完全控制舍入行为。 如果未指定舍入模式,并且无法表示确切的结果,则会引发 ;
ArithmeticException
否则,可以通过向运算提供适当的
MathContext
对象,将计算执行到所选的精度和舍入模式。 在任一情况下,都为控制舍入提供了 8 <>个 em 舍入模式</em>。 已弃用此类中的整数字段 (如
#ROUND_HALF_UP
) 来表示舍入模式;应改用) (
RoundingMode#HALF_UP
的枚举值
RoundingMode
enum
。
例如,
MathContext
当为对象提供精度设置为 0 (时,
MathContext#UNLIMITED
) ,算术运算和不
MathContext
采用任何对象的算术方法一样精确。 作为计算确切结果的必然结果,不使用精度设置为 0 的
MathContext
对象的舍入模式设置,因此不相关。 在除数的情况下,确切的商可能具有无限长的十进制扩展:例如,1 除以 3。 如果商具有非确定性十进制扩展,并且指定运算以返回确切结果,
ArithmeticException
则会引发 。 否则,将返回除法的确切结果,就像对其他操作一样。
当精度设置不为 0 时,算术规则
BigDecimal
与 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000 (第 7.4 节) 中定义的算术操作模式广泛兼容。 与这些标准不同,
BigDecimal
包括许多舍入模式。 解决这些 ANSI 标准和
BigDecimal
规范之间的任何冲突,有利于
BigDecimal
。
由于同一数值可以具有不同的表示形式 (具有不同刻度) ,因此算术和舍入规则必须指定数值结果和结果表示中使用的刻度。
相同数值的不同表示形式称为同一
队列
的成员。 #compareTo (BigDecimal) 自然顺序
BigDecimal
认为同一队列的成员彼此相等。 相反,
#equals(Object) equals
方法要求数值和表示形式都相同才能保持相等。 和 等
#scale()
#unscaledValue()
方法的结果将因数值相等而不同,表示形式不同。
一般情况下,舍入模式和精度设置确定当确切结果的位数多 (在除数和平方根) 比返回的位数多时,操作返回结果的方式有限。
首先,要返回的总数由
MathContext
的
precision
设置指定;这决定了结果的
精度
。 数字计数从确切结果的最左侧非零位开始。 舍入模式确定任何丢弃的尾随数字如何影响返回的结果。
对于所有算术运算符,将执行运算,就像先计算一个确切的中间结果,然后舍入为精度设置指定的位数 (,如有必要,使用所选舍入模式) 。 如果未返回确切结果,则会丢弃确切结果的一些数字位置。 当舍入增加返回结果的量级时,可以通过传播到前导“9”位的携带来创建新的数字位置。 例如,将值 999.9 舍入为三位数字,在数字上等于 1000&次;10<sup>1</sup>。 在这种情况下,新的“1”是返回结果的前导数字位置。
对于具有
MathContext
参数的方法和构造函数,如果结果不精确,但舍入模式为
RoundingMode#UNNECESSARY UNNECESSARY
,
ArithmeticException
则将引发 。
除了逻辑精确结果外,每个算术运算都有表示结果的首选比例。 下表列出了每个操作的首选比例。
<table class=“striped” style=“text-align:left”>描述文字计算运算<结果 /描述文字><thead><tr><th scope=“col”>Operation</th><th scope=“col”Result<></>tr<>/thead<>tbody<>tr><th scope=“row”>Add</th><td>max (addend.scale () , augend.scale (><) ) </td><tr><th scope=“row”>Subtract</th><td>max (minuend.scale () , subtrahend.scale () ) </td<>tr><th scope=“row”>Multiply</th><td>multiplier.scale () + multiplicand.scale () </td><tr><th scope=“row”>Divide</th><td>dividend.scale () - divisor.scale () </td<>tr><th scope=“row”>Square root</th><td>radicand.scale () /2</td<>/tbody></table>
这些刻度是返回确切算术结果的方法使用的刻度;不同之处在于,精确除法可能必须使用更大的刻度,因为确切的结果可能具有更多的数字。 例如,
1/32
为
0.03125
。
在舍入之前,逻辑精确中间结果的刻度是该操作的首选刻度。 如果确切的数字结果不能以数字表示
precision
,舍入将选择要返回的数字集,并且结果的比例将从中间结果的刻度减少到可以表示
precision
实际返回的数字的最小小数位数。 如果确切的结果最多可以使用位数表示
precision
,则返回与首选刻度最接近的结果表示形式。 具体而言,通过删除尾随零并减小刻度,可以以少于
precision
位数表示完全可表示的商。 例如,使用 RoundingMode#FLOOR 地板舍入模式舍入到三位数字, <br>
19/100 = 0.19 // integer=19, scale=2
<Br>
但<br>
21/110 = 0.190 // integer=190, scale=3
<Br>
请注意,对于加、减和乘,小数位数的减少将等于丢弃的确切结果的位数位置数。 如果舍入导致携带传播创建新的高阶数字位置,则会放弃结果的附加数字,而不是未创建新数字位置时。
其他方法可能具有略有不同的舍入语义。 例如,使用 #pow (int,MathContext) 指定算法的方法的结果
pow
有时与舍入数学结果不同,在最后一个位置,一个
#ulp () ulp
。
提供了两种类型的运算用于操作缩放
BigDecimal
:缩放/舍入运算和小数点运动运算。 缩放/舍入运算 (
#setScale setScale
和
#round round
) 返回一个
BigDecimal
,其值大约 (或完全) 等于操作数的值,但其刻度或精度是指定值;也就是说,它们增加或减少存储数字的精度,对其值的影响最小。 小数点运动操作 (
#movePointLeft movePointLeft
,
#movePointRight movePointRight
) 通过将小数点在指定方向上移动指定距离来返回
BigDecimal
从操作数创建的 。
作为 32 位整数,刻度的值集很大,但有边界。 如果结果的刻度超出 32 位整数的范围(溢出或下溢),则操作可能会引发
ArithmeticException
。
为简洁起见,在方法的整个说明
BigDecimal
中使用伪代码。 伪代码表达式是 “
BigDecimal
其值是
BigDecimal
i
添加到 的
BigDecimal
j
的 的 的简写。
(i + j)
伪代码表达式是 “
true
如果 且仅当
BigDecimal
i
表示与 相同的值
j
BigDecimal
时,
(i == j)
其他伪代码表达式的解释方式类似。 方括号用于表示定义
BigDecimal
值的特定
BigInteger
和刻度对;例如,[19, 2] 在
BigDecimal
数字上等于 0.19,其刻度为 2。
为任何输入参数传递
null
对象引用时,此类的所有方法和构造函数都会引发
NullPointerException
。
在 1.1 中添加。
的
java.math.BigDecimal
Java 文档。
此页面的部分内容是基于
创建和共享的工作进行的修改,并根据
署名许可
中所述的术语使用。