Я реализовал метод равенства(Object o) для объекта скорости (
Код: Выделить всё
VitesseКод: Выделить всё
@Test
@DisplayName("Ex E1, Benson Ch. 3")
void ex_Benson_Ch3_E1() {
LOGGER.info("Asafa Powell (Jamaïque) court 100m en 9.74s. Quelle est sa vitesse moyenne ?\nSerait-il en infraction dans une zone scolaire où la vitesse est limitée à 30 km/h ?");
Vitesse vitesseMoyenne = new Vitesse(100, 9.74); // Par défaut, en mètres secondes
assertEquals(10.3, vitesseMoyenne.vitesse(), 0.1, "La vitesse moyenne du coureur n'est pas la bonne, en m/s");
// Vérifier les conversions, étape par étape
Vitesse v1 = new Vitesse(vitesseMoyenne);
v1.convertir(KILOMETRE);
assertEquals(0.0103, v1.vitesse(), 0.1, "La vitesse moyenne du coureur n'est pas la bonne, en km/s");
assertEquals("km/s", v1.uniteMesure().symbole(), "La vitesse moyenne du coureur n'est pas exprimée en km/s");
v1.convertir(HEURE);
assertEquals(36.961, v1.vitesse(), 0.001, "La vitesse moyenne du coureur n'est pas la bonne, en km/h (A)");
assertEquals("km/h", v1.uniteMesure().symbole(), "La vitesse moyenne du coureur n'est pas exprimée en km/h (A)");
// Vérifier la conversion d'un seul tenant
Vitesse v2 = new Vitesse(vitesseMoyenne);
v2.convertir(KILOMETRE, HEURE);
assertEquals(36.961, v2.vitesse(), 0.001, "La vitesse moyenne du coureur n'est pas la bonne, en km/h (B)");
assertEquals("km/h", v2.uniteMesure().symbole(), "La vitesse moyenne du coureur n'est pas exprimée en km/h (B)");
if (v2.vitesse() > 36.0) {
LOGGER.info("Il serait bien en infraction dans une zone limitée à 30 km/h !");
}
else {
Assertions.fail("Il aurait dû être en infraction dans une zone limitée à 30 km/h");
}
// La vitesse moyenne, qui est restée en m/s, doit être égale à celle en km/h.
assertEquals(vitesseMoyenne, v2, "La vitesse moyenne du coureur, en m/s, doit être la même que celle en km/h, car une conversion est attendue durant la comparaison");
}
Где-то в методе равенства возврат v == this.valeur.doubleValue() отвечает (правильно!) false, потому что из:
объекта this со значением 10,266940451745379 м/с
и o параметр для метода Equals со значением 36,96098562628337 км/ч
который следует считать равным после преобразования, он сравнивает в конечном итоге 10,26694045174538 км/ч с 10,266940451745379 км/ч... чьи четыре последних десятичных знака не равны.
Мой вопрос
В данном случае я мог бы сказать:
Код: Выделить всё
| 10.26694045174538 - 10.266940451745379 | < 0.001Вывод из | 10.26694045174538 - 10.266940451745379 | < 0,001 верно.
Но что, если сравниваемые два числа были 0,0000005671226 и 0,0000005671425?
Код: Выделить всё
| 0.00000056722 - 0.00000056742 | < 0.001Я хотел бы знать, как на основе одного из сравниваемых значений я мог бы определить значение, которое следует присвоить правому члену моего неравенства.
Во втором примере это может быть:
Код: Выделить всё
| 0.00000056722 - 0.00000056742 | < 0.0000000001Вместо этого Сказано по-другому:
Как автоматизировать определение правильного значения c из значения a здесь:
Код: Выделить всё
| a - b | < cПодробнее здесь: https://stackoverflow.com/questions/798 ... und-method
Мобильная версия