这只是好奇心。如果我将两个递归数字或非理性数字存储在两个双打中,然后执行一些操作,它将如何产生实际结果?
例如,
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
如何生成这些准确的结果?
如果您稍微修改代码,您会发现d1
和d2
并非完全7/3
或5/3
。d1+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往返模式
,总和在所选值集中的最接近值