我发现使用显示的十进制格式和舍入模式时,某些值表现出意外

    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


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

最佳答案

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

长话短说,如果您想精确舍入,请使用BigDecimal(以及BigDecimal类的valueOf Function)

10-07 13:11