
本文介绍如何使用DecimalFormat配合RoundingMode.DOWN,将如0.23、0.28等double值统一向下截断为0.2(保留一位小数且永不进位),避免默认的四舍五入行为。
本文介绍如何使用decimalformat配合roundingmode.down,将如0.23、0.28等double值统一向下截断为0.2(保留一位小数且永不进位),避免默认的四舍五入行为。
在Java中,DecimalFormat默认采用RoundingMode.HALF_EVEN(银行家舍入法),当对0.23或0.28格式化为"#.#"时,会按常规四舍五入规则处理——例如0.25及以上变为0.3,这与需求不符。若要求所有0.21~0.29范围内的数值均稳定输出为0.2(即向零方向截断,而非四舍五入),需显式设置舍入模式为RoundingMode.DOWN。
RoundingMode.DOWN表示“向零舍入”:正数直接截去多余小数位,不进位;负数同理(如-0.28 → -0.2)。该行为完全符合题设中“最小值截断”的语义。
以下是完整示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class FloorToTenths {
public static void main(String[] args) {
DecimalFormat df2 = new DecimalFormat("#.#");
df2.setRoundingMode(RoundingMode.DOWN); // 关键:启用向下截断
System.out.println(df2.format(0.21)); // 输出: 0.2
System.out.println(df2.format(0.23)); // 输出: 0.2
System.out.println(df2.format(0.25)); // 输出: 0.2 ← 不再是0.3!
System.out.println(df2.format(0.28)); // 输出: 0.2
System.out.println(df2.format(0.29)); // 输出: 0.2
System.out.println(df2.format(0.30)); // 输出: 0.3
}
}⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
-
RoundingMode.DOWN与Math.floor()不同:后者作用于double并返回double,而DecimalFormat影响的是字符串格式化结果,不改变原始数值精度; - 若需严格数学意义上的“向下取整到十分位”(如
0.28 → 0.2),也可用Math.floor(value * 10) / 10.0,但DecimalFormat + DOWN更适用于格式化输出场景; - 确保
DecimalFormat实例复用前已正确设置setRoundingMode(),避免多线程下因共享实例导致行为异常。
总结:通过df2.setRoundingMode(RoundingMode.DOWN),即可让DecimalFormat对正数执行可靠的小数位截断,精准满足“0.21–0.29恒得0.2”的业务需求。

















