
java 中截断 double 小数位数到两位(非四舍五入),需避免 `printf` 等默认向上/银行舍入行为,推荐使用 `decimalformat` 配合 `roundingmode.down` 或 `bigdecimal.setscale(2, roundingmode.down)` 实现精确截断。
在 Java 中,System.out.printf("%.2f", 19.867) 或 String.format("%.2f", 19.867) 默认采用 HALF_UP 舍入模式,因此会输出 19.87 —— 这是“四舍五入”,而非题目要求的“直接截断”(即向零方向舍去多余小数)。要实现真正的保留两位小数且不进位(如 19.867 → 19.86,-3.149 → -3.14),必须显式指定舍入模式为 RoundingMode.DOWN。
✅ 推荐方案一:使用 DecimalFormat
import java.text.DecimalFormat;
import java.math.RoundingMode;
double number1 = 19.867;
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(number1)); // 输出:19.86⚠️ 注意:"#.##" 模式会自动省略末尾零(如 5.0 → "5"),若需强制显示两位小数(如 5.00),应改用 "0.00" 模式:
DecimalFormat df = new DecimalFormat("0.00"); // 保证输出两位小数
df.setRoundingMode(RoundingMode.DOWN);✅ 推荐方案二:使用 BigDecimal(更精确、推荐用于金融等敏感场景)
立即学习“Java免费学习笔记(深入)”;
import java.math.BigDecimal;
import java.math.RoundingMode;
double number1 = 19.867;
BigDecimal bd = new BigDecimal(Double.toString(number1)) // ⚠️ 关键:用字符串构造,避免 double 二进制精度误差
.setScale(2, RoundingMode.DOWN);
System.out.println(bd.doubleValue()); // 19.86
// 或直接获取字符串结果(推荐):
System.out.println(bd.toString()); // "19.86"❗ 重要提醒:务必使用 new BigDecimal(Double.toString(number1)) 而非 new BigDecimal(number1),否则可能因 double 的二进制表示缺陷引入意外精度误差(例如 0.1 在 double 中本就不精确)。
? 总结:










