2016-11-14 41 views
0

我使用Java 7的,我只是想将值四舍五入至小数点后2位,样本代码也从各种计算器环节给出:四舍五入值至2位小数在java中

Double d1= 4.37 ,  d2=0.694444444; //expected result after multiplication of numbers d1 and d2 is 3.04 
DecimalFormat df = new DecimalFormat("#.#####"); 
     String str = df.format(d1*d2); 
     d=(Double)df.parse(str); 
     System.out.println(d);//Prints 3.03472 
     df = new DecimalFormat("#.####"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.0347 
     df = new DecimalFormat("#.###"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.035 
     df = new DecimalFormat("#.##"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d); //Prints my desired result 3.04 

这难道不是可能的话可以在2或3条语句中做到这一点。

问候

克里斯

+0

哈哈,它是java。大多数事情至少需要10行代码 –

+1

为什么不保留小数分辨率,而当我们要输出时,请保留我们的'System.out.println(String.format(“%。2f”,d))'。 –

+0

@HaleemurAli:我想将最终结果3.04分配给一个双变量,最后将其存储在数据库中。问候,克里斯 – chiku

回答

1

的问题是,预期的结果3.04是没有意义的,如果四舍五入到最接近的值应该是3.03。 4.37 * 0.694444444结果是3.03472222028,这是接近3.03再到3.04:

abs 3.03472222028 - 3.03 = 0.00472222028 
abs 3.03472222028 - 3.04 = 0.00527777972 

所以实际上你需要的是

new DecimalFormat("#.##"); 

但作为Klitos说,你可能会想保留真正的价值尽可能长,只有当你不得不坚持到数据库才会发生。在那里你可以使用

String.format("%.2f", value) 

更新17/11

随着比如你提供:

DecimalFormat df = new DecimalFormat("#.##"); 
    String result = df.format(10.85*1/1.44); 

结果是7.53(正确的)。 但是,用你的代码,结果是7.54,这是错误的。

这是因为您按顺序舍入每个数字并且累积错误,导致舍入错误,如您在提供的示例中可以看到的那样。

所以你真的不需要编写自己的舍入算法。你可以使用默认的new DecimalFormat("#.##")

+0

我正在写一个小的java程序来提取excel舍入值并将其转储到db中,示例数据如下所示: 收入,Fx比率(1/1.44),Actual,Calc,Diff,(Revenue * Fx Rate ) 10.85,0.6694444444,7.53,7.54,-0.009999999999999787,7.5347222174 //错误 10.98,0.6694444444,7.63,7.63,0.0,7.62499999512 //精确度 关于kris – chiku