Это отчасти академично, поскольку для моих целей мне нужно только округлить до двух знаков после запятой; но я очень хочу знать, что происходит, чтобы произвести два немного разных результата.
Это тест, который я написал, чтобы сузить его до самой простой реализации:
@Test
public void shouldEqual() {
double expected = 450.00d / (7d * 60); // 1.0714285714285714
double actual = 450.00d / 7d / 60; // 1.0714285714285716
assertThat(actual).isEqualTo(expected);
}
Но с этим выходом не получается:
org.junit.ComparisonFailure:
Expected :1.0714285714285714
Actual :1.0714285714285716
Может кто-нибудь объяснить подробно, что происходит под капотом, чтобы привести к тому, что значение на 1.000000000000000 X
будет другим?
Некоторые из вопросов, которые я ищу в ответе, следующие: Где теряется точность? Какой метод является предпочтительным и почему? Что на самом деле правильно? (В чистой математике, оба не могут быть правы. Возможно, оба ошибаются?) Есть ли лучшее решение или метод для этих арифметических операций?