我一直在努力避免在 Java 中使用 BigDecimalMultiply() 方法时精度损失。 请检查上面的示例代码。
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
,从而重新引入了精度的缺乏。
DecimalFormat
直接支持BigDecimal
,所以不需要阅读doubleValue
。另外,最好避免使用 double
创建输入值。
NumberFormat formatter = new DecimalFormat("0.####################");
formatter.setGroupingUsed(true);
String strRt = "10000000000";
String strIrt = "17911250000";
System.out.println(strRt);
System.out.println(strIrt);
BigDecimal result = new BigDecimal(strRt).multiply(new BigDecimal(strIrt));
System.out.println(formatter.format(result));