BigDecimal 文档

BigDecimal 介绍


BigDecimal,不可变的,带符号的任意精度的十进制数字。1个BigDecimal对象由任意精度整数非标定值和32位整数度组成。如果为0或正数,则精度是小数点右侧的位数。如果是负数,则该数字的非缩放值乘以10乘以该比例否定的幂。BigDecimal类提供了用于计算的api,比较、计算、舍入等。toString 方法将BigDecimal用规范的格式表示出来。

BigDecimal类为舍入提供了完全控制。如果未指定舍入模式并且无法表示确切结果,会抛出异常。可以通过提供的MathContext对象来达到选定的精度和舍入模式,建议使用RoundingMode类枚举值。无论哪种情况,都提供8种舍入模式。使用此类中的整数字段(如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包含许多舍入模式,这些模式在5之前的BigDecimal版本中必须进行划分。这些ANSI标准与BigDecimal规范之间的任何冲突都将通过BigDecimal解决。

由于相同的数值可以具有不同的表示(具有不同的比例),因此算术和舍入的规则必须同时指定数值结果和结果表示中使用的比例。

一般来说,舍入模式和精度设置决定了当精确结果有更多数字(在除法的情况下可能无限多)比返回的位数更多时,操作如何返回结果的有限位数。首先,返回的数字总数由MathContext的精度设置指定;这决定了结果的精确度。数字计数从精确结果的最左边的非零数字开始。舍入模式决定丢弃的尾随数字如何影响返回的结果。

对于所有算术运算符,该操作的执行过程与首先计算精确的中间结果一样,然后四舍五入为精度设置指定的位数(如有必要),使用选定的舍入模式。如果没有返回确切的结果,则丢弃精确结果的一些数字位置。当四舍五入增加返回结果的幅度时,可以通过传播到前导“9”数字的进位来创建新的数字位置。例如,四舍五入将数值999.9为三位数将等于一千,表示为100×101。在这种情况下,新的“1”是返回结果的前几位。

除了逻辑准确的结果之外,每个算术运算都有一个表示结果的首选标度。下表列出了每种操作的首选比例。


这些精度是返回精确算术结果的方法所使用的精度;除非确切的结果可能有更多的数字,所以可能必须使用更大的比例。例如,1/32是0.03125。

在舍入之前,逻辑确切的中间结果的比例是该操作的首选比例。如果精确数字不能表示精确的数字结果,则舍入将选择要返回的数字集合,并将结果的比例从中间结果的比例缩小到可以表示实际返回的精度数字的最小比例。如果精确结果可以用最多精度数字表示,则返回具有与最佳比例最接近的结果的表示。特别是,通过去除尾随零和减小比例,可以用精确数字表示精确表示的商。例如,使用落地舍入模式舍入到三位数字,

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的简写,它的值是BigDecimal的值,添加到BigDecimal j的BigDecimal。”伪代码表达式(i == j)是“当且仅当BigDecimal i表示与BigDecimal j相同的值时为真”的简写。其他伪代码表达式的解释类似。方括号用于表示定义BigDecimal值的特定BigInteger和缩放对;例如[19,2]是数字等于0.19的BigDecimal,其比例为2。

注意:如果BigDecimal对象用作SortedMap中的键或SortedSet中的元素,那么应该小心,因为BigDecimal的自然排序与equals不一致。有关更多信息,请参阅Comparable,SortedMap或SortedSet。

当为任何输入参数传递空对象引用时,此类的所有方法和构造函数都会引发NullPointerException。


猜你喜欢

转载自blog.csdn.net/yx1166/article/details/80336542
今日推荐