一段四舍五入的代码,

for (int i = 0; i < 100; i++) {
String str = "84"+i+".545";
//System.out.println(Math.round(Double.valueOf(str)));

Double d = Double.valueOf(str);
BigDecimal b = new BigDecimal(d);
double db = (double) b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(db+"");
}目的想保留两位小数,但结果却出人意料。
结果一:
循环第6次:846.54
循环第7次:847.54
循环第8次:848.54
循环第9次:849.54
循环第10次:8410.55
循环第11次:8411.55
循环第12次:8412.55
循环第13次:8413.55 ••••••改变str的值为:String str = "1"+i+".545";
打印结果:
循环第5次:15.54
循环第6次:16.55
循环第7次:17.55
循环第8次:18.55
循环第9次:19.55
循环第10次:110.55
循环第11次:111.55
循环第12次:112.55
循环第13次:113.55
循环第14次:114.55
循环第15次:115.55
循环第16次:116.55
循环第17次:117.55
循环第18次:118.55
循环第19次:119.55
循环第20次:120.55
循环第21次:121.55
循环第22次:122.55
循环第23次:123.55
循环第24次:124.55
循环第25次:125.55
循环第26次:126.55
循环第27次:127.55
循环第28次:128.54
循环第29次:129.54
循环第30次:130.54
循环第31次:131.54
循环第32次:132.54
循环第33次:133.54
循环第34次:134.54
循环第35次:135.54
循环第36次:136.54 ••••••
四舍五入,取两位小数。执行的时候出现了问题,我不知道问题出在哪里?代码应该没有问题,是否方法不对?

解决方案 »

  1.   

    for (int i = 0; i < 100; i++) {
    String str = "84" + i + ".545";
    // System.out.println(Math.round(Double.valueOf(str)));
    DecimalFormat df = new DecimalFormat("#.00");
    Double d = Double.valueOf(str);
    System.out.println(df.format(d));
    }
      

  2.   

    应该是浮点数转换时产生的精度损失问题。
    我在原来的浮点数后加了0.0001就可以了。
    for (int i = 0; i < 100; i++) {                                                
    String str = "84"+i+".545";                                                
    //System.out.println(Math.round(Double.valueOf(str)));                     
                                                                                   
    Double d = Double.valueOf(str);                                            
    BigDecimal b = new BigDecimal(d+0.0001);                                   
    double db = (double) b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    System.out.println(db+"");                                                 
    }                                                                              
      

  3.   

    String str =String.valueOf(84+i)+".545" ;
    试试吧
      

  4.   

    Math.round(value*100)/100 直接搞定了。
      

  5.   

    BigDecimal b = new BigDecimal(d); //这里用BigDecimal的时候,最好不要用double参数,用String参数,double本身就不精确,传到BigDecimal里也就可能不精确
    改成
    BigDecimal b = new BigDecimal(str);
    试试看