为什么这些不同的数字相同?

时间:2015-08-25 02:40:18

标签: java floating-accuracy

我正在进行单元测试,我有这条线:

assertEquals(1.1886027926838422606868849265505866347, 1.18860279268384230000000000000000000000,0);

如果delta为0,则它​​们必须完全相同才能通过,而且它们显然不是,但是这个测试通过,请自己尝试。

将增量更改为1E-50仍然会通过。

当它们是两个非常不同的数字时,它为什么会通过?

2 个答案:

答案 0 :(得分:10)

这是因为Java编译器将这两个数字文字舍入到相同的数字。

运行此实验:

System.out.println(1.1886027926838422606868849265505866347);
System.out.println(1.18860279268384230000000000000000000000);

这会打印相同的数字(demo):

1.1886027926838423
1.1886027926838423

double基元类型最多只能处理16个小数位,因此它不能将这些数字一直表示到最后一位数。

如果您想要完全精确,请改用BigDecimal

答案 1 :(得分:0)

两个数字之间的差异太小而无法表示,因此它们相等。你得到大约16位十进制数字。