groovy中默认的bigdecimal标度

时间:2015-10-05 14:42:05

标签: groovy bigdecimal

groovy中BigDecimal的默认比例是多少?和舍入?

因此,在尝试进行计算时:

def x = 10.0/30.0 //0.3333333333
def y = 20.0/30.0 //0.6666666667

基于此,我可以假设它使用了刻度10并且向上舍入了一半。 虽然找不到官方文件,但却很难找到。

1 个答案:

答案 0 :(得分:5)

您可以在官方文档中找到它:The case of the division operator

  

5.5.1。除法运算符的情况

     

除法运算符/(和/ =用于除法和赋值)产生   如果操作数是浮点数或双精度数,则为double结果   否则为BigDecimal结果(当两个操作数都是任意组合时)   整数类型short,char,byte,int,long,BigInteger或   小数)。

     

如果使用divide()方法执行BigDecimal除法   除法是准确的(即产生可以表示的结果   在相同精度和比例的范围内),或使用   MathContext,精度为两个操作数的最大值   精度 加上10的额外精度,以及最大的刻度   10和操作数的最大比例

并在BigDecimalMath.java中查看:

public Number divideImpl(Number left, Number right) {
    BigDecimal bigLeft = toBigDecimal(left);
    BigDecimal bigRight = toBigDecimal(right);
    try {
        return bigLeft.divide(bigRight);
    } catch (ArithmeticException e) {
        // set a DEFAULT precision if otherwise non-terminating
        int precision = Math.max(bigLeft.precision(), bigRight.precision()) + DIVISION_EXTRA_PRECISION;
        BigDecimal result = bigLeft.divide(bigRight, new MathContext(precision));
        int scale = Math.max(Math.max(bigLeft.scale(), bigRight.scale()), DIVISION_MIN_SCALE);
        if (result.scale() > scale) result = result.setScale(scale, BigDecimal.ROUND_HALF_UP);
        return result;
    }
}