Java porównywanie wartości w pętli while

0

Pewnie pytanie z kategorii banalnie prostych ale sam nie umiem doszukać się błędu:
Otóż mam taką pętle w Javie i nie wiem dla czego nie wykonuje się ona jeszcze raz gdy (wszystko typu double): X_FIRST=2,5 step = 2,7 a X_LAST = -0,2 czyli -0.2>=-0.2 a pętla się nie wykonuje.

while((X_FIRST-step)>=X_LAST)

Natomiast ta pętla dla powyższych wartości się wykonuje poprawnie ale dla innych również ostatni krok nie działa

while(X_LAST+step<=X_FIRST)

Z góry dzięki za odpowiedzi

0

Żeby to ogarnąć, zrób sobie takie obliczenie i wyświetl co Ci wyjdzie:

public static void main(String[] args) {
        double x = 2.5;
        double y = 2.7;
        double z  = x -y;
        System.out.println(z);
}
0
-0.20000000000000018

1

Nie wiem co dokładnie liczysz i jakie jest twoje zadanie.
Ponieważ jednak ani 2.5, ani 2.7 nie da się dokładnie przedstawić w postaci double. Tak jak 1/3 nie da się przedstawić dokładnie w postaci ułamka dziesiętnego, tak 0.1 (1/10), 0.2 itd nie da się przedstawić dokładnie w postaci ułamka dwójkowego. Zobacz i poćwicz z sobie output binary : https://www.exploringbinary.com/floating-point- niconverter/

Więc 2.5 - 2.7 zrobione na double nie będzie równe 0.2 (będzie dość bliskie).

a) Jeśli potrzebujesz operować na liczbach dziesiętnych to wtedy zamiast double musisz użyć BigDecimal ( i będzie duzo wiecej w javie pisania :-().
b) Alternatywą jest dodanie do X_FIRST pewnego małego epsilona np. 0.00001 i wtedy będzie to pewnie w twoim przypadku ok. Ten epsilon załatwi błedy zaokrlągleń. (X_FIRST=2.500001).

jeśli operujesz na pieniadzach, które ustawowo muszą być liczone dziesiętnie wtedy zawsze a.
jeśli to jakaś grafika, symulacje fizyczne itp. gdzie nie ma znaczenia dokładność - to wtedy b

1 użytkowników online, w tym zalogowanych: 0, gości: 1