BigDecimal注意事项

2024/10/29 Java工具类BigDecimal
在 Java 中,当你使用 `BigDecimal` 进行除法运算时,如果结果是一个非终止小数(例如,`20 / 55` 的结果是 `0.363636...`),而没有指定舍入模式,Java 会抛出 `ArithmeticException`,提示“Non-terminating decimal expansion: no exact representable decimal result”。

要解决这个问题,你可以在 divide 方法中指定一个舍入模式。下面是一个示例,展示如何进行这种操作:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDivisionExample {
    public static void main(String[] args) {
        BigDecimal numerator = new BigDecimal("20");
        BigDecimal denominator = new BigDecimal("55");

        // 指定舍入模式进行除法
        BigDecimal result = numerator.divide(denominator, 10, RoundingMode.HALF_UP);

        System.out.println("结果: " + result);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 说明

  • divide(BigDecimal divisor, int scale, RoundingMode roundingMode): 这里 scale 指定小数点后的位数,RoundingMode 指定舍入模式。
  • 在这个示例中,我们将结果保留到小数点后10位,并使用 HALF_UP 舍入模式。


在 Java 中,如果你想处理 `double` 类型的数字,使得在输出时去掉小数点后多余的零,可以使用 `DecimalFormat` 或者 `BigDecimal` 来实现。以下是两种常见的方法。

# 方法 1: 使用 DecimalFormat

你可以使用 DecimalFormat 来格式化输出,去掉多余的小数点后的零:

import java.text.DecimalFormat;

public class DoubleFormatExample {
    public static void main(String[] args) {
        double value1 = 10.0;
        double value2 = 10.00;
        double value3 = 10.123;

        DecimalFormat df = new DecimalFormat("#.##");

        System.out.println("格式化后的值: " + df.format(value1)); // 输出: 10
        System.out.println("格式化后的值: " + df.format(value2)); // 输出: 10
        System.out.println("格式化后的值: " + df.format(value3)); // 输出: 10.12
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 方法 2: 使用 BigDecimal

你也可以使用 BigDecimal 来处理并格式化数字:

import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        double value1 = 10.0;
        double value2 = 10.00;
        double value3 = 10.123;

        System.out.println("处理后的值: " + formatDouble(value1)); // 输出: 10
        System.out.println("处理后的值: " + formatDouble(value2)); // 输出: 10
        System.out.println("处理后的值: " + formatDouble(value3)); // 输出: 10.12
    }

    private static String formatDouble(double value) {
        BigDecimal bd = new BigDecimal(value);
        return bd.stripTrailingZeros().toPlainString();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 说明

  • DecimalFormat: 使用特定的模式来格式化数字,"#.##" 意味着最多保留两位小数,不会在末尾添加多余的零。
  • BigDecimal.stripTrailingZeros(): 这个方法会去掉末尾的零,toPlainString() 则可以获取没有科学计数法的字符串表示。

你可以根据具体需求选择使用哪种方法。如果还有其他问题或需要更多帮助,请告诉我!

Last Updated: 2024/10/29 09:41:29