繁体   English   中英

Java-将double / float舍入到两位小数时出现意外结果

[英]Java - unexpected result when rounding a double/float to 2 decimals

将小数点后两位取整时会遇到问题。 我知道这个问题已经在很多地方问过了。 但是我的问题略有不同,在其他地方找不到。

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

  1. Math.round(double*100.0)/100.0
  2. DecimalFormat(“###.##”)

我正在尝试使用第一种方式:一种自定义方式来加倍加倍。 当第二个小数为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

所以,我的问题是,无论最后一个小数是否为0,我如何才能有一个带2个小数的双精度值。 我知道我可以使用第二种方法DecimalFormat(“###.##”)实现我想要的! 但是有可能通过第一种方法做到吗?

编辑:感谢您的答案。 似乎无法使用round()方法来实现它。 但是,有些人建议使用两种方法的组合来实现。 但是我认为仅使用DecimalFormat(“###.##”)可以得到我想要的。 有人可以确认吗?

我建议使用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

您是否尝试过以下方法?

DecimalFormat(“###.00”)

如果没记错的话,使用#号时尾随零将留为空白。

我相信您需要结合使用两者来满足您的需求。 四舍五入以获得带有两个小数的数字,而DecimalFormat显示带有两个小数的数字。

您应该使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM