如何将两个递归数字存储为双打总和到整数



这只是好奇心。如果我将两个递归数字或非理性数字存储在两个双打中,然后执行一些操作,它将如何产生实际结果?

例如,

double d1=7d/3;
double d2=5d/3;
double sum=d1+d2;
System.out.println(new BigDecimal(sum)); //prints exactly 4

另一个:

double d1=log10(3);
double value=Math.pow(10,d1);
System.out.println(new BigDecimal(value)); //prints exactly 3

如何生成这些准确的结果?

如果您稍微修改代码,您会发现d1d2并非完全7/35/3d1+d2完全是4的原因是4可以完全表示为双重,并且最接近此添加的结果。

public static void main(String[] args) throws Exception {
    double d1 = 7d / 3;
    double d2 = 5d / 3;
    System.out.println(new BigDecimal(d1)); //2.333333333333333481363069950020872056484222412109375
    System.out.println(new BigDecimal(d2)); //1.6666666666666667406815349750104360282421112060546875
    System.out.println(new BigDecimal(d1).add(new BigDecimal(d2))); //4.0000000000000002220446049250313080847263336181640625
    double sum = d1 + d2; 
    System.out.println(new BigDecimal(sum)); //4
}

java遵循IEEE 754大会:

使用IEEE 754往返模式

,总和在所选值集中的最接近值

最新更新