Nieoczekiwane zachowanie danych podwójnego typu prymitywnego

Chcę zrozumieć, jak Javadouble typ przechowa swoją wartość w pamięci w Javie. Po uruchomieniu następującego kodu otrzymuję nieoczekiwane wyjście:

public static void main(String[] args)  {

    float a = 1.5f;
    float b= 0.5f;
    double c= 1.5;
    double d = 0.5;

    float a1 = 1.4f;
    float b1= 0.5f;
    double c1= 1.4;
    double d1 = 0.5;

    System.out.println(" a- b is " + (a-b));
    System.out.println(" c- d is " + (c-d));
    System.out.println("a1-b1 is " + (a1-b1));
    System.out.println("c1-d1 is " + (c1-d1));

}

Wydajność:

 a- b is 1.0
 c- d is 1.0
a1-b1 is 0.9
c1-d1 is 0.8999999999999999

Dlaczego jestc1-d1 nie równe0.9?

Próbowałem także innych różnych wartości, ale jakiś czas zwraca oczekiwany wynik, a czasem nie.

questionAnswers(2)

yourAnswerToTheQuestion