【发布时间】:2013-01-14 16:09:57
【问题描述】:
我对金额有以下要求:
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(),结果也不好。
如何以所需的方式对金额进行四舍五入?
编辑:
为什么我实际上需要以这种看似奇怪的方式进行舍入?
在我们正在开发的新软件中,我们需要重现舍入行为或旧软件(这是企业希望进行舍入的方式)
解决方案:
我绝对希望在所有计算中都使用 BigDecimals。
所以,最后我想出了这个简单的函数来进行“渐进式”舍入:
public static BigDecimal roundAmount(BigDecimal amount) {
for (int i = amount.scale(); i >= 2; i--) {
amount = amount.setScale(i, RoundingMode.HALF_UP);
}
return amount;
}
【问题讨论】:
-
第一个例子看起来很奇怪(尤其是第三个),你到底需要什么?
-
你确定第二行吗?在我看来,第一个值不是您显示的值,或者舍入不是以这种方式发生的
-
为什么 1.2448 舍入到 1.25?
-
1.2448 -> 1.25:这毫无意义。为什么需要不对称的舍入间隔? -
您的舍入要求到底是什么?你的例子留下了模棱两可的空间。
标签: java rounding bigdecimal