Как систематизировать проверку «а вполне равно b» (либо методом округления, либо | a - b | ~ 0) для любого значения a?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как систематизировать проверку «а вполне равно b» (либо методом округления, либо | a - b | ~ 0) для любого значения a?

Сообщение Anonymous »

Мой контекст
Я реализовал метод равенства(Object o) для объекта скорости ( здесь), что, когда он сталкивается с сравниваемым значением в м/с, когда оно само в км/ч (в примере), перед сравнением значений также помещается сравниваемое значение в км/ч. И я тестирую его в этом тесте, где он запускается последним оператором AssertEquals(...):

Код: Выделить всё

@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
Но мой метод равенства(Объект o), который сравнивает значения и сначала решает преобразовать их в другую единицу измерения, должен работать для любого диапазона значений...
Вывод из | 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»