| Both JUnit and Truth allow for asserting equality of floating point numbers with | |
| an absolute tolerance. For example, the following statements are equivalent, | |
| ```java | |
| double EPSILON = 1e-20; | |
| assertThat(actualValue).isWithin(EPSILON).of(Math.PI); | |
| assertEquals(Math.PI, actualValue, EPSILON); | |
| ``` | |
| What's not immediately obvious is that both of these assertions are checking | |
| exact equality between `Math.PI` and `actualValue`, because the next `double` | |
| after `Math.PI` is `Math.PI + 4.44e-16`. | |
| This means that using the same tolerance to compare several floating point | |
| values with different magnitude can be prone to error, | |
| ```java | |
| float TOLERANCE = 1e-5f; | |
| assertThat(pressure).isWithin(TOLERANCE).of(1f); // GOOD | |
| assertThat(pressure).isWithin(TOLERANCE).of(10f); // GOOD | |
| assertThat(pressure).isWithin(TOLERANCE).of(100f); // BAD -- misleading equals check | |
| ``` | |
| A larger tolerance should be used if the goal of the test is to allow for some | |
| floating point errors, or, if not, `isEqualTo` makes the intention more clear. |