【发布时间】:2015-10-05 14:42:04
【问题描述】:
Groovy 中 BigDecimal 的默认比例是多少?和四舍五入?
所以在尝试进行计算时:
def x = 10.0/30.0 //0.3333333333
def y = 20.0/30.0 //0.6666666667
基于此,我可以假设它使用 10 级并四舍五入。 但是很难找到这样的官方文档。
【问题讨论】:
标签: groovy bigdecimal
Groovy 中 BigDecimal 的默认比例是多少?和四舍五入?
所以在尝试进行计算时:
def x = 10.0/30.0 //0.3333333333
def y = 20.0/30.0 //0.6666666667
基于此,我可以假设它使用 10 级并四舍五入。 但是很难找到这样的官方文档。
【问题讨论】:
标签: groovy bigdecimal
可以在官方文档中找到:The case of the division operator
5.5.1。除法运算符的情况
除法运算符 /(和 /= 用于除法和赋值)产生 如果任一操作数是浮点数或双精度数,则返回双精度结果,并且 否则 BigDecimal 结果(当两个操作数都是 整数类型 short、char、byte、int、long、BigInteger 或 BigDecimal)。
BigDecimal 除法使用 divide() 方法,如果 除法是精确的(即产生可以表示的结果 在相同的精度和比例范围内),或使用 精度为两个操作数中最大值的 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;
}
}
【讨论】: