Skip to content

BigDecimal文档里,建议对保留规则设置为ROUND_HALF_EVEN #2129

@sunquan123

Description

@sunquan123

文档里BigDecimalUtil类选择的保留规则是RoundingMode.HALF_UP,即四舍五入。代码部分如下:

/**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = BigDecimal.valueOf(v);
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
    }

建议修改为BigDecimal.ROUND_HALF_EVEN,也就是RoundingMode.HALF_EVEN,即四舍六入五成双(为什么会发现:做项目时发现不同的写法,去查资料看了)。
Snipaste_2023-08-10_21-12-40
我就把百度的四舍六入五成双规则贴过来了:
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。
推荐使用四舍六入五成双规则的原因:
从统计学的角度,“四舍六入五成双”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“四舍六入五成双”使测量结果受到舍入误差的影响降到最低。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request or suggestion

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions