Java中如何将数值四舍五入保留n位小数 RoundingMode不生效如何解决
修正方案
问题根源
- 浮点精度丢失:将字符串直接转换为
Float单精度浮点型时,类似27.285的十进制小数无法被精确存储,转换后实际值略小于字面量,导致舍入判断出错。 - 舍入模式不匹配:
RoundingMode.UP为无条件进位模式,只要舍去部分非零就向前一位进1,不符合常规四舍五入逻辑,需改用RoundingMode.HALF_UP(舍去部分≥0.5时进位,否则舍去)。
可直接运行的修正代码
import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; public class RoundingTest { public static void main(String[] args) { // 三个测试输入 String[] testVolumes = {"5.853", "27.285", "27.284"}; DecimalFormat df = new DecimalFormat("#.##"); // 配置为标准四舍五入模式 df.setRoundingMode(RoundingMode.HALF_UP); for (String volume : testVolumes) { // 字符串直接转BigDecimal,完全规避浮点精度丢失问题 BigDecimal decimal = new BigDecimal(volume); String result = df.format(decimal); System.out.println(result); } } }
测试输出结果
- 输入
"5.853"→ 输出"5.85" - 输入
"27.285"→ 输出"27.29" - 输入
"27.284"→ 输出"27.28"
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

