我使用的是Java 7,我只想将值四舍五入到小数点后两位,示例代码也来自各种stackoverflow链接:
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 :(得分: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("#.##")
中的默认值。