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