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

Java中double类型求和无法精确取值,如何保留两位小数?

解决double求和精度问题并保留两位小数

问题根源

double类型采用二进制浮点数存储,无法精确表示部分十进制小数(比如12.69、15.99这类数在二进制中是近似值),相加后误差会被放大,导致出现超长小数位。用BigDecimal可以避免这类精度问题,同时轻松控制小数位数。

推荐解决方案:从字符串直接解析为BigDecimal(源头避免精度损失)

既然你的数值是从字符串解析来的,不要先转成double,直接用BigDecimal解析字符串,这样能完全保留原始数值精度:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class SumExample {
    public static void main(String[] args) {
        String numStr1 = "12.69";
        String numStr2 = "15.99";

        // 直接从字符串解析为BigDecimal
        BigDecimal bd1 = new BigDecimal(numStr1);
        BigDecimal bd2 = new BigDecimal(numStr2);

        // 求和
        BigDecimal sum = bd1.add(bd2);

        // 保留两位小数,指定四舍五入模式
        BigDecimal finalResult = sum.setScale(2, RoundingMode.HALF_UP);

        System.out.println(finalResult); // 输出 28.68
    }
}

关键说明

  • setScale(2, RoundingMode.HALF_UP):第一个参数2表示保留两位小数;第二个参数是舍入模式,HALF_UP是常用的四舍五入规则。根据需求你还可以选择其他模式:
    • RoundingMode.DOWN:直接截断多余小数位(比如28.689会变成28.68)
    • RoundingMode.CEILING:向上取整(比如28.681会变成28.69)
  • 若必须处理已有的double值:不要用new BigDecimal(double)(会保留double的近似误差),改用BigDecimal.valueOf(double),它会将double转成对应字符串再解析,精度更可靠:
double d1 = 12.69;
double d2 = 15.99;

BigDecimal bd1 = BigDecimal.valueOf(d1);
BigDecimal bd2 = BigDecimal.valueOf(d2);

BigDecimal sum = bd1.add(bd2);
BigDecimal finalResult = sum.setScale(2, RoundingMode.HALF_UP);

System.out.println(finalResult); // 输出 28.68

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:08