使用 BigDecimal
精确的十进制运算
使用 BigDecimal 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
精确的十进制运算
BigDecimal 来自 java.math 包,能够以任意 precision 表示十进制数,并且没有隐藏的舍入误差。它是金融计算的标准工具。
创建 BigDecimal
创建 BigDecimal 最安全的方式是从字符串创建。这样可以保留您输入的确切数字。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal amount = new BigDecimal("42.50");
System.out.println(amount);
}
}不可变性
BigDecimal 是不可变的。add 等操作不会更改原对象,而是返回一个新的 BigDecimal。您必须保存返回的值。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10");
a.add(new BigDecimal("5"));
System.out.println(a);
}
}加法与减法
请使用 add 和 subtract,并记得保存结果。每次调用都会返回一个新值。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal price = new BigDecimal("19.99");
BigDecimal tax = new BigDecimal("1.60");
BigDecimal total = price.add(tax);
System.out.println(total);
}
}乘法
multiply 的行为符合预期。请注意,结果的 scale 是各操作数 scale 之和。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal unit = new BigDecimal("2.50");
BigDecimal qty = new BigDecimal("3");
System.out.println(unit.multiply(qty));
}
}除法需要谨慎
对无法整除的值进行除法(例如 1 除以 3)会产生无限小数。直接调用 divide 会抛出 ArithmeticException。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
try {
System.out.println(one.divide(three));
} catch (ArithmeticException e) {
System.out.println("Need to specify rounding!");
}
}
}带舍入的除法
请提供 scale 和 RoundingMode,以便安全地进行除法。在这里,我们保留两位小数并采用向上舍入。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
System.out.println(one.divide(three, 2, RoundingMode.HALF_UP));
}
}比较数值
请使用 compareTo 比较数值。不要使用 equals,因为 equals 会考虑 scale:2.0 和 2.00 使用 equals 比较时不相等,但使用 compareTo 比较时相等。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("2.00");
System.out.println(a.equals(b));
System.out.println(a.compareTo(b) == 0);
}
}实用常量
BigDecimal 提供了现成的常量:BigDecimal.ZERO、BigDecimal.ONE 和 BigDecimal.TEN。请使用它们,而不是自行创建。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal sum = BigDecimal.ZERO;
sum = sum.add(BigDecimal.TEN);
System.out.println(sum);
}
}计算列表总和
一种常见模式是从 BigDecimal.ZERO 开始,在循环中逐个相加,并在每次相加后保存结果。
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal[] prices = {
new BigDecimal("1.10"),
new BigDecimal("2.20"),
new BigDecimal("3.30")
};
BigDecimal total = BigDecimal.ZERO;
for (BigDecimal p : prices) {
total = total.add(p);
}
System.out.println(total);
}
}最佳实践
请记住要点:从字符串创建,将值视为不可变值,进行除法时始终指定舍入方式,并使用 compareTo 进行比较。
快速检查
测试您对 BigDecimal 的了解。
回顾
您已经学会使用 BigDecimal:
- 从字符串创建它,以获得精确的数字
- 它是不可变的,因此必须保存每次操作的结果
- 直接使用
add、subtract和multiply - 对于非终止结果,
divide需要 scale 和RoundingMode - 使用
compareTo而不是equals进行比较
常见问题解答
「使用 BigDecimal」课时是免费的吗?
是的 — 「使用 BigDecimal」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「使用 BigDecimal」这节课中我会学到什么?
精确的十进制运算 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 BigDecimal」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么不应使用 double 表示金额
- 使用 BigDecimal
- 舍入与刻度
- 使用 BigInteger 处理超大数字