0Pricing
Java Academy · 课时

舍入与刻度

控制精度和舍入模式

舍入与刻度 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

scale 与 precision

每个 BigDecimal 都有一个 scale,即小数点右侧的位数。数值 12.340 的 scale 为 3。控制 scale 可以让您以恰好两位小数显示金额。

检查 scale

调用 scale() 可以查看一个值包含多少位小数,调用 precision() 可以查看有效数字的总位数。

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal v = new BigDecimal("12.340");
        System.out.println(v.scale());
        System.out.println(v.precision());
    }
}

使用 setScale 修正小数位数

setScale 会强制将值设置为指定的小数位数。如果需要舍入,您必须传入 RoundingMode。

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

public class Main {
    public static void main(String[] args) {
        BigDecimal v = new BigDecimal("12.3456");
        System.out.println(v.setScale(2, RoundingMode.HALF_UP));
    }
}

四舍五入,常用模式

RoundingMode.HALF_UP 会舍入到最接近的值,遇到中间值时远离零舍入。这就是人们在学校学习的日常四舍五入。

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

public class Main {
    public static void main(String[] args) {
        System.out.println(new BigDecimal("2.5").setScale(0, RoundingMode.HALF_UP));
        System.out.println(new BigDecimal("3.5").setScale(0, RoundingMode.HALF_UP));
    }
}

银行家舍入

HALF_EVEN 会将中间值舍入到最接近的偶数位。这可以减少多次舍入产生的偏差,因此银行更偏好这种方式。

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

public class Main {
    public static void main(String[] args) {
        System.out.println(new BigDecimal("2.5").setScale(0, RoundingMode.HALF_EVEN));
        System.out.println(new BigDecimal("3.5").setScale(0, RoundingMode.HALF_EVEN));
    }
}

CEILING 与 FLOOR

CEILING 始终向正无穷方向舍入,FLOOR 始终向负无穷方向舍入,无论被舍弃的数字是多少。

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

public class Main {
    public static void main(String[] args) {
        BigDecimal v = new BigDecimal("2.1");
        System.out.println(v.setScale(0, RoundingMode.CEILING));
        System.out.println(v.setScale(0, RoundingMode.FLOOR));
    }
}

DOWN 与 UP

DOWN 向零截断,而 UP 始终远离零舍入。DOWN 就是简单的截断。

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

public class Main {
    public static void main(String[] args) {
        BigDecimal v = new BigDecimal("2.9");
        System.out.println(v.setScale(0, RoundingMode.DOWN));
        System.out.println(v.setScale(0, RoundingMode.UP));
    }
}

除法过程中的舍入

除法可能产生无限小数,因此您需要直接在 divide 调用中提供 scale 和舍入模式。

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

public class Main {
    public static void main(String[] args) {
        BigDecimal bill = new BigDecimal("100.00");
        BigDecimal people = new BigDecimal("3");
        System.out.println(bill.divide(people, 2, RoundingMode.HALF_UP));
    }
}

去除末尾零

stripTrailingZeros 会移除多余的零。将它与 toPlainString 结合使用,可以避免输出科学计数法。

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal v = new BigDecimal("12.300");
        System.out.println(v.stripTrailingZeros().toPlainString());
    }
}

格式化金额

为了显示金额,请使用 HALF_UP 将 scale 设置为 2,这样价格始终会显示两位小数,即使金额是整数也是如此。

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

public class Main {
    public static void main(String[] args) {
        BigDecimal amount = new BigDecimal("7");
        System.out.println(amount.setScale(2, RoundingMode.HALF_UP));
    }
}

选择模式

对于面向普通用户的舍入,请选择 HALF_UP;对于会计计算,请选择 HALF_EVEN,以减少累积偏差。请始终明确指定模式,确保代码不会因非终止结果而抛出异常。

快速检查

测试您对 scale 和舍入的了解。

回顾

您已经学会控制 precision:

  • scale 是小数点后的位数
  • setScale 固定小数位数,并要求提供 RoundingMode
  • HALF_UP 是日常四舍五入,HALF_EVEN 是银行家舍入
  • CEILING、FLOOR、UP 和 DOWN 涵盖了方向性舍入
  • 进行除法时始终指定模式,以避免异常

常见问题解答

「舍入与刻度」课时是免费的吗?

是的 — 「舍入与刻度」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「舍入与刻度」这节课中我会学到什么?

控制精度和舍入模式 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「舍入与刻度」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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