相关文章推荐
爱搭讪的烤土司  ·  Error: Unknown ...·  5 月前    · 
高大的豆浆  ·  SpringBoot中配置freemarke ...·  1 年前    · 
如果为零或正数,则比例是小数点右侧的位数。 如果是负数,则将数字的未缩放值乘以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的大小 从以下版本开始:
  •