浮点数的比较

对浮点数比较时有时可能会有这种写法:

private double DELTA = 1e-15;

@Test
public void testDelta(){
    assertEquals(123.456, 123.456, DELTA);
}

炫技感十足。

 

其实这是由于十进制的浮点数在计算机中用二进制表示时可能出现精度损失

> 1.5 - 1
0.5
> 1.4 - 1
0.3999999999999999
> 1.3 - 1
0.30000000000000004
> 1.3 - 1 == 0.3
False
> 1.3 == 1.3
True

  

因此比较浮点数时,只要涉及到了数值的转化或者计算,一定不可以直接用等号判等。

 

解决方案:

1. epsilon 精确度控制

如开头示例

2.采用 BigDecimal 表示数字

3.位运算 - 异或

if (a ^ b) return False;

4.长位表示

Double.doubleToLongBits(expected) == Double.doubleToLongBits(result)

 

posted @ 2021-11-18 00:05  小天儿  阅读(284)  评论(0)    收藏  举报