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

Java中避免自动舍入问题:不使用BigDecimal的解决方案

解决Java中double求和的精度问题(不使用BigDecimal)

你遇到的问题本质是double作为二进制浮点数,无法精确表示部分十进制小数,比如1.05、2.55这类数值在内存中存储的是近似值,求和后就会出现类似3.5999999999999996的结果。不使用BigDecimal的话,有两种可行方案:

方案一:整数缩放计算(适合需要精确计算的场景)

将小数放大为整数进行运算,避免二进制浮点数的精度损耗,运算完成后再缩小回原比例:

double x = 1.05d;
double y = 2.55d;

// 先将数值放大100倍,用Math.round修正转换误差
int scaledX = (int) Math.round(x * 100);
int scaledY = (int) Math.round(y * 100);

// 整数求和后再缩小回原比例
double result = (scaledX + scaledY) / 100.0;

System.out.println(result); // 输出 3.6

注:使用Math.round是因为1.05d实际存储的是略小于1.05的二进制值,直接乘以100会得到104.99999999999999,round后能得到正确的整数105。

方案二:格式化输出(适合仅需展示正确结果的场景)

如果只是需要在控制台或界面显示正确的数值,不需要修改实际计算值,可以通过格式化工具指定显示精度:

double x = 1.05d;
double y = 2.55d;
double sum = x + y;

// 方式1:使用String.format保留两位小数
System.out.println(String.format("%.2f", sum)); // 输出 3.60

// 方式2:使用DecimalFormat自定义格式
DecimalFormat df = new DecimalFormat("#.##");
System.out.println(df.format(sum)); // 输出 3.6

注:这种方式仅改变数值的显示形式,sum变量的实际值仍然是3.5999999999999996,如果后续还要用该值进行计算,仍会存在精度问题。

内容的提问来源于stack exchange,提问作者Dasun.edirisinghe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:01:18