将double格式化为两位小数无法正常工作

3

我想要对这个双精度数进行四舍五入:

3.499999999999999

to:

3.50

我已经使用了这两种方法:

DecimalFormat df = new DecimalFormat("0.00");
        double result = Double.valueOf(df.format(input));
        System.out.println(answer);

并且

public double round(double input)
    {
        int decimalPlace = 2;
        BigDecimal bd = new BigDecimal(input);
        bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);

        return (bd.doubleValue());
    }

但它一直在打印输出:
3.5

有人有解决这个问题的方法吗?因为我真的认为这应该可行。感谢您的帮助。


3
考虑到3.5 == 3.50,也许你的问题应该是关于格式而不是舍入? - Erik
4个回答

14

你的第一个解决方案非常接近。只需这样做:

    DecimalFormat df = new DecimalFormat("0.00");
    System.out.println(df.format(input));
你的代码之所以无法运行,是因为你将输入的双精度数值转换成带有2位小数的字符串,然后再将其转换回双精度数值。而System.out.println会按照原来的方式输出双精度数值,并不会按照特定的小数位数规则进行输出。

3
你可以使用printf格式化字符串,这可能更简单易懂。
System.out.printf("%.2f%n", 3.5);

打印
3.50

1
你尝试用#替换0了吗?
DecimalFormat df = new DecimalFormat("#.##"); System.out.println(df.format(input));
根据这里的说明,如果数字不存在,#将被解析为0。

2
抱歉,那完全不是问题提问者想要的方式。"#.##"会打印出"3.5","0.00"会打印出"3.50"。(我刚刚测试过以确保正确) - Jon Bright

0
你可以使用Apache Commons Math的Precision类。
double result = Precision.round(3.499999999999999, 2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接