舍入与刻度
控制精度和舍入模式
舍入与刻度 是 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固定小数位数,并要求提供RoundingModeHALF_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 反馈 — 无需本地设置。