我有以下要求来舍入金额:
1.2448 -> 1.25
3.349 -> 3.35
0.474 -> 0.47
我已经尝试了BigDecimal的所有可能模式 . setScale(2,RoundingMode . )方法,没有任何成功 . 结果如下:
UP: 1.25, 3.35, 0.48
HALF_UP: 1.24, 3.35, 0.47
CEILING: 1.25, 3.35, 0.48
FLOOR: 1.24, 3.34, 0.47
DOWN: 1.24, 3.34, 0.47
HALF_DOWN: 1.24, 3.35, 0.47
HALF_EVEN: 1.24, 3.35, 0.47
我也试过使用BigDecimal.round(),结果也不好 .
如何以所需方式舍入金额?
Edit:
为什么我真的需要以这种看似奇怪的方式进行回合?
在我们正在开发的新软件中,我们需要重现舍入行为或遗留软件(这是业务需要四舍五入的方式)
Solution:
我绝对想留下BigDecimals用于我的所有计算 .
所以,最后我想出了这个简单的函数来进行“渐进式”舍入:
public static BigDecimal roundAmount(BigDecimal amount) {
for (int i = amount.scale(); i >= 2; i--) {
amount = amount.setScale(i, RoundingMode.HALF_UP);
}
return amount;
}
4 回答
试试这个 .
你要做的是逐步舍入每个数字 . 1.2448 - > 1.245 - > 1.25 .
这意味着向上舍入所需的最小数字是.nn4444444444444445,在缩放后为1/18时接近1/2 - 4/9 .
每当我看到有人建议这是不正确的,但它很容易计算 .
版画
正如您所看到的,添加1/18的需要是一个奇数,但这是您在逐步向上舍入每个数字时实际执行的操作 .
使用
HALF_UP
但是第一轮到三个小数位然后再到2.问题是你想要的舍入显示不一致的逻辑,因为1.2448小于1.245,所以它通常会向下舍入 . 但是首先将其舍入到3个位置将使其达到1.245,然后将其舍入到1.25 .从here和there:
例如:
打印: