Java 对大数运行该方法会产生不准确的结果

Java 对大数运行该方法会产生不准确的结果,java,Java,我有这样的方法 public double count(double a, double b) { return a + b; } 对于参数:“111111111111111111111111111111111111111111+1” 预期: 11111111111111111111111111111111111111111111 2 实际产出: 1.1111112E41 如何改变它 public BigDecimal count(double a, double b) {

我有这样的方法

    public double count(double a, double b) {
    return a + b;
}
对于参数:“111111111111111111111111111111111111111111+1”
预期: 11111111111111111111111111111111111111111111 2
实际产出: 1.1111112E41

如何改变它

public BigDecimal count(double a, double b) {
    BigDecimal x= BigDecimal.valueOf(a);
    BigDecimal y= BigDecimal.valueOf(b);
    return x.add(y);

} 

对于这个实际输出:1111111111 200000000000000000001.0 wtf?

如注释中所述,
双精度
只有约16位有效小数精度(请参阅)。因此,这导致了这种不协调:

// 25 1's
double a = 1111111111111111111111111.;
double b = 100;
double c = (a + b);
System.out.println((a == c));  // true
在您的示例中,最好使用
BigDecimal
。下面是一个例子:

 BigDecimal bd = new BigDecimal("111111111111111111111111111111111111111111.5");
 System.out.println(bd);
 bd = bd.add(new BigDecimal(1));
 System.out.println(bd);
印刷品:

111111111111111111111111111111111111111111.5
111111111111111111111111111111111111111112.5
1.1111111111111112E41
返回到double将失去精度:

System.out.println(bd.doubleValue());
印刷品:

111111111111111111111111111111111111111111.5
111111111111111111111111111111111111111112.5
1.1111111111111112E41

另外,如果您只处理整数,那么
biginger
就足够了。

这是否回答了您的问题?java
double
大约有16个有效的十进制数字-您还可以在示例参数中找到
a==count(a,1)
。改变?请参见
BigDecimal
。对于您的
BigDecimal
示例-您没有抓住要点-当您将double初始化为您认为是41 1s的序列时-它将丢失重要数字(而不是幅度)到~16。您最好从案例中的字符串构造一个BigDecimal。thx Andy 1234567