0Pricing
Java Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么不应使用 double 表示金额
  2. 使用 BigDecimal
  3. 舍入与刻度
  4. 使用 BigInteger 处理超大数字
← 返回 Java Academy