You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java DecimalFormat无法将17.755四舍五入保留两位小数问题

解决Double类型17.755四舍五入保留两位小数的异常问题

问题核心是浮点数精度误差:17.755这个十进制数无法被二进制浮点数(Double类型)精确存储,实际在内存中的值是略小于17.755的近似值(比如17.754999999999998...)。DecimalFormat格式化时会基于这个近似值判断,自然不会进位,最终得到17.75;而17.7551的近似值足够接近真实值,能触发进位逻辑,所以结果符合预期。

解决方案

1. 用BigDecimal处理精确小数运算(推荐)

这是处理金融、精确小数场景的标准方案,彻底避免浮点数精度问题:

BigDecimal input = new BigDecimal("17.755");
BigDecimal output = input.setScale(2, RoundingMode.HALF_UP);
System.out.println(output); // 输出17.76

⚠️ 必须通过字符串构造BigDecimal,如果用Double类型构造(new BigDecimal(17.755)),会带入原有的精度误差,依然无法得到正确结果。

2. 显式指定DecimalFormat的舍入模式(不推荐)

即使指定HALF_UP舍入模式,也无法解决Double本身的精度问题,对17.755依然无效,但可以规范其他场景的舍入逻辑:

Double input = 17.755;
DecimalFormat twoDigitDecimalFormat = new DecimalFormat("0.00");
twoDigitDecimalFormat.setRoundingMode(RoundingMode.HALF_UP);
Double output = Double.valueOf(twoDigitDecimalFormat.format(input));
System.out.println(output); // 仍可能输出17.75

3. 临时方案:将Double转为字符串再处理

如果业务中必须使用Double类型,可以先把数值转为字符串,再用BigDecimal处理:

Double input = 17.755;
BigDecimal inputBigDecimal = new BigDecimal(String.valueOf(input));
BigDecimal output = inputBigDecimal.setScale(2, RoundingMode.HALF_UP);
System.out.println(output); // 输出17.76

内容的提问来源于stack exchange,提问作者Abdul Mohsin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:20:17