相关文章推荐
[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 &times; 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 文档。

此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可 中所述的术语使用。

 
推荐文章