2015-10-05 1 views
3

Что такое масштаб по умолчанию BigDecimal в groovy? И округление?шкала дефолтного значения по умолчанию в groovy

Так, при попытке сделать расчеты:

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

Основание на это, я могу предположить, что он использует шкалу 10 и округление половину вверх. Не удалось найти официальную документацию, говорящую об этом.

ответ

5

Вы можете найти его в официальной документации: The case of the division operator

5.5.1. Случай оператора деления

деление операторы/(и/= для разделения и распределения) производить двойной результат, если один из операндов с плавающей точкой или двойной, а BigDecimal результат в противном случае (когда оба операнда любая комбинация of интегральный тип short, char, byte, int, long, BigInteger или BigDecimal).

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; 
    } 
} 
+0

Немного поздно, чтобы спросить, но, как вы знаете, что BigDecimalMath.java используется? – froi