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

Java中对double向下取整至两位小数的正确方法及负数取整异常

解决Java中double负数向下取整到两位小数的问题

这个问题我之前踩过坑!你遇到的情况是DecimalFormat结合RoundingMode.FLOOR处理接近0的负数时的常见问题——明明应该向下取整到-0.01,结果却得到了-0.00,核心原因其实是double类型的二进制浮点精度限制加上DecimalFormat的内部舍入逻辑导致的。

问题根源

double类型用二进制存储十进制小数时,很多数值无法精确表示(比如-0.009),实际存储的是一个非常接近目标值但略大(更靠近0)的近似值。当DecimalFormat用FLOOR模式处理这个近似值时,会错误地判断它更接近-0.00而非-0.01。

推荐解决方案:用BigDecimal精确处理

要彻底避免浮点精度问题,最好用BigDecimal来控制舍入逻辑,它能精确处理十进制数值,完全符合你的预期。示例代码如下:

import java.math.BigDecimal;
import java.math.RoundingMode;
import org.junit.Test;

public class MyTest {
    void formatAndPrint(double value) {
        // 注意:用Double.toString(value)转成字符串再构造BigDecimal,避免直接转double的精度损失
        BigDecimal decimalValue = new BigDecimal(Double.toString(value));
        // 设置保留两位小数,采用FLOOR向下取整模式
        BigDecimal flooredValue = decimalValue.setScale(2, RoundingMode.FLOOR);
        System.out.println(value + " => " + flooredValue.toPlainString());
    }

    @Test
    public void testFloor() {
        formatAndPrint(2.3289);  // 输出:2.3289 => 2.32
        formatAndPrint(2.3);     // 输出:2.3 => 2.30
        formatAndPrint(-0.009);  // 输出:-0.009 => -0.01(符合预期)
        formatAndPrint(-0.001);  // 输出:-0.001 => -0.01(FLOOR向下取整,向更负方向舍入)
        formatAndPrint(-0.01);   // 输出:-0.01 => -0.01
    }
}

备选方案:用Math.floor手动计算(谨慎使用)

如果你坚持想用DecimalFormat,可以先手动通过Math.floor完成取整逻辑,再格式化:

import java.text.DecimalFormat;
import org.junit.Test;

public class MyTest {
    void formatAndPrint(double value) {
        // 先乘以100取floor,再除以100得到两位小数的向下取整结果
        double flooredValue = Math.floor(value * 100) / 100;
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println(value + " => " + df.format(flooredValue));
    }

    @Test
    public void testFloor() {
        formatAndPrint(2.3289);  // 2.3289 => 2.32
        formatAndPrint(-0.009);  // -0.009 => -0.01
    }
}

不过这个方案仍可能受double精度影响(比如某些极端数值的乘法会出现误差),所以还是优先推荐BigDecimal的方案。

内容的提问来源于stack exchange,提问作者Jos de Jong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:36