java 中的值四舍五入到小数点后两位

rounding off values to 2 decimal places in java

我正在使用 Java 7,我只是想将值四舍五入到小数点后两位,示例代码也来自各种 Whosebug 链接:

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 个语句中做到这一点。

此致

克里斯

问题是预期结果 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,这是错误的。

那是因为你按顺序对每个数字进行舍入,误差累积,导致舍入误差,如你提供的示例所示。

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