BigDecimal注意事项
FCAT 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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 说明
DecimalFormat
: 使用特定的模式来格式化数字,"#.##"
意味着最多保留两位小数,不会在末尾添加多余的零。BigDecimal.stripTrailingZeros()
: 这个方法会去掉末尾的零,toPlainString()
则可以获取没有科学计数法的字符串表示。
你可以根据具体需求选择使用哪种方法。如果还有其他问题或需要更多帮助,请告诉我!