Java中BigDecimal multiply()方法精度丢失问题及精准求解
Java BigDecimal乘法精度丢失问题解决方法
问题场景
我尝试解决Java中使用BigDecimal multiply()时的精度丢失问题,以下是示例代码:
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class HelloWorld{ public static void main(String []args){ double result = 0; NumberFormat formatter = new DecimalFormat("0.####################"); formatter.setGroupingUsed(true); //10000000000 //17911250000 String strRt = formatter.format(10000000000.0); String strIrt = formatter.format(17911250000.0); System.out.println(strRt); System.out.println(strIrt); result = new BigDecimal(strRt).multiply(new BigDecimal(strIrt)).doubleValue(); System.out.println(formatter.format(result)); } }
预期输出
10000000000 17911250000 179112500000000000000
实际输出
10000000000 17911250000 179112499999999980000
解决方法
问题出在将BigDecimal结果转成double的步骤——double类型的精度有限,无法准确存储超大整数,导致精度丢失。要保持计算精准,全程用BigDecimal处理,最后直接输出BigDecimal对象或转成字符串,不要转成double。
修改后的代码示例:
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class HelloWorld{ public static void main(String []args){ NumberFormat formatter = new DecimalFormat("0.####################"); formatter.setGroupingUsed(true); //10000000000 //17911250000 String strRt = formatter.format(10000000000.0); String strIrt = formatter.format(17911250000.0); System.out.println(strRt); System.out.println(strIrt); // 直接用BigDecimal存储结果,避免转double BigDecimal result = new BigDecimal(strRt).multiply(new BigDecimal(strIrt)); // 直接输出BigDecimal原生值 System.out.println(result); // 如需格式化输出,直接用formatter处理BigDecimal System.out.println(formatter.format(result)); } }
关键说明
- BigDecimal专为高精度计算设计,只要不转成double/float这类精度有限的浮点类型,就能保证计算结果完全精准。
- 原始代码中
doubleValue()是精度丢失的核心原因:double的存储机制无法覆盖所有超大整数,会自动做近似处理。
内容的提问来源于stack exchange,提问作者yoyoyoni1004gmailcom
相关产品推荐
相关产品推荐

