关于Java中BigDecimalmultiply()方法的问题

问题描述 投票:0回答:1

我一直在努力避免在 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

还有其他方法可以得到准确的结果吗? 预先感谢。

precision bigdecimal
1个回答
0
投票

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));
© www.soinside.com 2019 - 2024. All rights reserved.