将值四舍五入到java中的2位小数

时间:2016-11-14 13:53:58

标签: java-7

我使用的是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个陈述中执行此操作。

此致

克里斯

1 个答案:

答案 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("#.##")中的默认值。