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
相关产品推荐
相关产品推荐

