-
Notifications
You must be signed in to change notification settings - Fork 46k
Closed
Labels
enhancementNew feature or request or suggestionNew feature or request or suggestion
Description
文档里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
,即四舍六入五成双(为什么会发现:做项目时发现不同的写法,去查资料看了)。
我就把百度的四舍六入五成双规则贴过来了:
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。
推荐使用四舍六入五成双规则的原因:
从统计学的角度,“四舍六入五成双”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“四舍六入五成双”使测量结果受到舍入误差的影响降到最低。
fank243, openSupporter237, PotatoYs, DrinkFish0 and withdong02
Metadata
Metadata
Assignees
Labels
enhancementNew feature or request or suggestionNew feature or request or suggestion