Java - 将double / float四舍五入为2位小数时的意外结果

时间:2013-05-02 07:53:07

标签: java math double decimal roundup

我将圆形加倍到2位小数时遇到问题。我知道很多地方都提出过这个问题。但我的问题略有不同,我在其他地方找不到。

据我所知,有两种方法可以做到这一点。

  1. Math.round(double*100.0)/100.0
  2. DecimalFormat(“###.##”)
  3. 我正在尝试使用第一种方式:自定义圆形双倍的方式。 当第二个小数为0时,结果将只打印第一个小数,而忽略第二个小数。

    例如,

    1. Math.round(1.23333*100.0)/100.0结果是1.23。这很好用。
    2. Math.round(3.90*100.0)/100.0.结果是3.9。出现问题。我想显示3.90而不是3.9
    3. Math.round(3*100.0)/100.0。结果是4.0。我想要4.00而不是4.0
    4. 所以,我的问题是,无论最后一个小数是否为0,我如何得到一个带有2位小数的双精度值。 我知道我可以使用第二种方式 - DecimalFormat(“###.##”)来实现我想要的!但是可以通过第一种方式来实现吗?

      编辑:谢谢你的回答。看起来不可能使用round()方法来实现它。但是,有些人建议使用2种方法的组合来实现它。但我认为仅使用DecimalFormat(“###.##”)可以获得我想要的东西。任何人都可以证实吗?

4 个答案:

答案 0 :(得分:1)

我建议使用String.format(“%1 $ .2f”,x)。它将值舍入到指定的精度(在我们的示例中为2位),并在右侧留下尾随零。

System.out.println(String.format("%1$.2f",3.121)) gives 3.12
System.out.println(String.format("%1$.2f",3.129)) gives 3.13
System.out.println(String.format("%1$.2f",3.12))  gives 3.12
System.out.println(String.format("%1$.2f",3.10))  gives 3.10

答案 1 :(得分:0)

您是否尝试过以下操作?

DecimalFormat(“###.00”)

如果没有弄错,使用#-sign时尾随零留空。

答案 2 :(得分:0)

我相信您需要结合使用两者来满足您的需求。 舍入得到一个带有两位小数的数字,DecimalFormat用两位小数显示它。

答案 3 :(得分:0)

您应该使用DecimalFormat

格式化结果
DecimalFormat format = new DecimalFormat("0.00");
System.out.println(Math.round(3.90*100.0)/100.0); // 3.9
System.out.println(format.format(Math.round(3.90*100.0)/100.0)); // after using format 3.90
System.out.println(format.format(Math.round(3*100.0)/100.0));

输出

3.9
3.90
3.00