如何在Java中舍入一个数字

时间:2017-03-17 17:18:06

标签: java bigdecimal decimalformat

我需要以下结果:

10.17111 -> 10.17
10.17445 -> 10.18

我尝试了BigDecimal和DecimalFormat方法以及RoundingMode类:

String value = "10.17111";
BigDecimal bd = new BigDecimal(value);
BigDecimal bdResult = bd.setScale(2, RoundingMode.UP);
String result = bdResult.toString();
System.out.println(result);

Print out = 10.18
Should be = 10.17

double ddd = 10.17111;
DecimalFormat d = new DecimalFormat("#.##");
d.setRoundingMode(RoundingMode.UP);
String outputResult = d.format(ddd).replace(',', '.');
System.out.println(outputResult);

Print out = 10.18
Should be = 10.17

使用BigDecimal:

String value2 = "10.17445";
Print out = 10.18
As I expected

使用DecimalFormat:

double ddd2 = 10.17445;
Print out = 10.17
Should be = 10.18

3 个答案:

答案 0 :(得分:1)

如果你真的想要逐个数字化,那么你应该认真思考它(也许告诉我们为什么你如此倾向于我很好奇),那么你可以做任何一个以下是我作为一个思想练习而不是建议,这是数学上合理的,我留给你自己决定:

1)编写一个算法,从你正在四舍五入的数字进行检查,并查看它是否是一个4的链,后跟一个比5更大的数字(10.44449)或只是一个大于5的数字( 10.49)。如果这样四舍五入到11,否则使用正常规则。

2)在循环中使用RoundingMode.HALF_UP或一次递归地执行一个数字。如果你有10.17445,那么你定义一个十进制格式#。####和round。然后#。###和圆。然后#。##和round。

没有标准方法的原因是因为它不是标准的。

答案 1 :(得分:0)

从最后开始逐个完成所有数字,直到你完成所需数量为止。

public static BigDecimal RoundIt(BigDecimal valueToRound, int precision)
{
    BigDecimal result = valueToRound;

    for (int i = valueToRound.precision(); i >= precision; i--)
    {
        result = result.setScale(i, RoundingMode.HALF_UP);
    }

    return result;
}

答案 2 :(得分:0)

我的解决方法,它工作正常:

public static String roundUp(String value) {

     BigDecimal bd = new BigDecimal(value.replace(',', '.'));
     BigDecimal bdResult = bd.setScale(4, RoundingMode.HALF_UP);
     BigDecimal bdResult2 = bdResult.setScale(3, RoundingMode.HALF_UP);
     BigDecimal bdResult3 = bdResult2.setScale(2, RoundingMode.HALF_UP);
     String result = bdResult3.toString();
     return result;

}