代码之家  ›  专栏  ›  技术社区  ›  jwv

十进制格式舍入模式产生不一致的值

  •  1
  • jwv  · 技术社区  · 9 年前

    我发现,使用所示的十进制格式和舍入模式会对某些值产生意外的影响

        double b = 123.135;
        //double b = 1896.675;
        //double b = 523.135;
    
        DecimalFormat df = new DecimalFormat(".##");
        df.setRoundingMode(RoundingMode.HALF_UP);
        System.out.println(b);
        String a = df.format(b);
        System.out.println(a);
    
        double roundOff = Math.round(b * 100.0) / 100.0;
        System.out.println(roundOff);
    

    生产:

    123.135
    123.14
    123.14
    

    我相信这是正确的。

    使用此值时:1896.675会产生以下结果:

    1896.675
    1896.67
    1896.68
    

    我认为这是出乎意料的-我在这里做错了什么?

    1 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    7 年前

    这里的问题是,由于二进制格式的限制,不可能将所有可能的分数存储在变量中。所以基本上,double正好接近您输入的值,这就是为什么会出现舍入错误的原因。 您可以在以下线程中阅读有关此主题的更多信息: how does java.math.RoundingMode work?

    长话短说,如果要精确舍入,请使用BigDecimal(和BigDeximal类的valueOf函数)