Java 双舍入始终为 2 位小数

2022-09-03 04:24:55

我正在尝试将双精度值四舍五入为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以下。

任何帮助是值得赞赏的!


答案 1

在代码中可以改进两件事。

首先,为了舍入而将双倍转换为BigDecimal是非常低效的方法。您应该改用 Math.round:

    double value = 1.125879D;
    double valueRounded = Math.round(value * 100D) / 100D;

其次,当您打印实数或将实数转换为字符串时,可以考虑使用 System.out.printf 或 String.format。在你的情况下,使用格式“%.2f”可以解决问题。

    System.out.printf("%.2f", valueRounded);

答案 2

我使用 String 类的格式() 函数。更简单的代码。“%.2f”中的 2 表示要显示的小数点后面的位数。“%.2f”中的 f 表示您正在打印浮点数。下面是有关设置字符串格式的文档(http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)

double number = 12.34567;
System.out.println(String.format("%.2f", number));