2016-01-11 38 views
1

我发现使用十进制格式,并四舍五入显示模式一些值十进制格式舍入模式产生不一致的值

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

设置的BigDecimal BD =新的BigDecimal(二);并打印bd结果1896.674999999999954525264911353588104248046875,我猜是接近存储的实际值。 – user3284549

回答

2

问题在于,由于二进制格式的限制,不可能将所有可能的分数存储在变量中。所以基本上双倍刚刚接近你输入的值,这就是为什么发生舍入错误。 你可以阅读更多关于这个主题的,例如这个线程:how does java.math.RoundingMode work?

长话短说,如果你想精确舍入使用的BigDecimal(BigDecimal类和的valueOf功能)

+1

请注意,即使BigDecimal只给出确切的结果,如果涉及的每个数字都可以精确地表示为小数部分。例如,它不能完全表示将1除以3​​的结果。 –