【问题标题】:default scale of bigdecimal in groovygroovy中bigdecimal的默认比例
【发布时间】: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


    【解决方案1】:

    可以在官方文档中找到: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;
        }
    }
    

    【讨论】:

    • 问的有点晚,但是,你怎么知道 BigDecimalMath.java 正在被使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多