我试图将双值舍入为2位小数,但它并不适用于所有场景
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
public static void main(String[] args) {
System.out.println(round(25.0,2)); //25.0 - expected 25.00
System.out.println(round(25.00d,2)); //25.0 - expected 25.00
System.out.println(round(25,2)); //25.0 - expected 25.00
System.out.println(round(25.666,2)); //25.67
}
简而言之,无论十进制是否存在,即使需要填充额外的零,也始终保持最多2位小数。
感谢任何帮助!
答案 0 :(得分:16)
您的代码中有两件事可以改进。
首先,向BigDecimal强制转换为圆形它是非常低效的方法。你应该使用Math.round:
double value = 1.125879D;
double valueRounded = Math.round(value * 100D) / 100D;
其次,当您打印或将实数转换为字符串时,您可以考虑使用System.out.printf或String.format。在你的情况下使用格式&#34;%。2f&#34;诀窍。
System.out.printf("%.2f", valueRounded);
答案 1 :(得分:5)
我使用String类的format()函数。更简单的代码。 2英寸&#34;%。2f&#34;表示要显示的小数点后的位数。 f in&#34;%。2f&#34;表示您正在打印浮点数。以下是有关格式化字符串(http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)
的文档double number = 12.34567;
System.out.println(String.format("%.2f", number));
答案 2 :(得分:5)
这对你有用:
public static void main(String[] args) {
DecimalFormat two = new DecimalFormat("0.00"); //Make new decimal format
System.out.println(two.format(25.0));
System.out.println(two.format(25.00d));
System.out.println(two.format(25));
System.out.println(two.format(25.666));
}
答案 3 :(得分:3)
您正在将BigDecimal
转换回double
,这实际上会修剪尾随零。
您可以返回BigDecimal
或BigDecimal.toPlainString()
。
public static String round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.toPlainString();
}