将双数舍入到2位小数

这个问题在这里已经有了答案:

  • 如何在Java中将数字四舍五入到小数点后三十个答案

  • 这是一个实用程序,它将舍入 (而不是截断)双精度到指定的小数位数。

    例如:

    round(200.3456, 2); // returns 200.35
    

    原始版本; 注意这一点

    public static double round(double value, int places) {
        if (places < 0) throw new IllegalArgumentException();
    
        long factor = (long) Math.pow(10, places);
        value = value * factor;
        long tmp = Math.round(value);
        return (double) tmp / factor;
    }
    

    这种情况在具有非常高的小数位数(例如round(1000.0d, 17) )或大整数部分(例如round(90080070060.1d, 9) )的角落情况下严重分解 。 感谢斯隆指出了这一点。

    我一直在使用上面的内容来快速将“不太大”的双打翻倍到2或3个小数位(例如,为了记录目的,以秒为单位清理时间:27.987654321987 - > 27.99)。 但我认为最好避免这种情况,因为更可靠的方法很容易获得,代码也更清晰。

    所以,改用它

    (由路易Wasserman这个答案和肖恩欧文这个答案。)

    public static double round(double value, int places) {
        if (places < 0) throw new IllegalArgumentException();
    
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(places, RoundingMode.HALF_UP);
        return bd.doubleValue();
    }
    

    请注意, HALF_UP是“在学校通常教授的”舍入模式。 仔细阅读RoundingMode文档,如果你怀疑你需要别的东西,比如银行家的舍入。

    当然,如果你愿意的话,你可以将上述内容嵌入一行:
    new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

    并且在每一种情况下

    请记住使用floatdouble浮点表示是不精确的。 例如,考虑这些表达式:

    999199.1231231235 == 999199.1231231236 // true
    1.03 - 0.41 // 0.6200000000000001
    

    为了确切,你想使用BigDecimal 。 而在它的时候,使用带有String的构造函数,而不是使用double的构造函数。 例如,尝试执行此操作:

    System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
    System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));
    

    关于该主题的一些优秀进一步阅读:

  • 第48项:Joshua Bloch在Effective Java(第二版)中的“避免floatdouble如果需要精确的答案”
  • 程序员应该知道什么是浮点运算

  • 如果你想要String格式化而不是严格舍入数字(或除此之外),请参阅其他答案。

    具体来说,注意round(200, 0) 200.0 round(200, 0)返回200.0 。 如果你想输出“ 200.00 ”,你应该先轮回,然后格式化输出的结果(这在Jesper的答案中有完美的解释)。


    如果您只想在小数点后打印一个有两位数字的double精度型,请使用如下所示的内容:

    double value = 200.3456;
    System.out.printf("Value: %.2f", value);
    

    如果您希望将结果显示为String而不是打印到控制台,请使用带相同参数的String.format()

    String result = String.format("%.2f", value);
    

    或者使用DecimalFormat类:

    DecimalFormat df = new DecimalFormat("####0.00");
    System.out.println("Value: " + df.format(value));
    

    我认为这很容易:

    double time = 200.3456;
    DecimalFormat df = new DecimalFormat("#.##");      
    time = Double.valueOf(df.format(time));
    
    System.out.println(time); // 200.35
    

    请注意,这实际上会对您进行四舍五入,而不仅仅是格式化。

    链接地址: http://www.djcxy.com/p/85795.html

    上一篇: Round a double to 2 decimal places

    下一篇: How to round up the result of integer division?