¿Por qué agregar 0.1 múltiples veces permanece sin pérdidas?

Sé que el0.1 el número decimal no se puede representar exactamente con un número binario finito (explicación), entoncesdouble n = 0.1 perderá algo de precisión y no será exactamente0.1. Por otra parte0.5 se puede representar exactamente porque es0.5 = 1/2 = 0.1b.

Habiendo dicho eso, es entendible que agregar0.1 tres veces no dará exactamente0.3 entonces se imprime el siguiente códigofalse:

double sum = 0, d = 0.1;
for (int i = 0; i < 3; i++)
    sum += d;
System.out.println(sum == 0.3); // Prints false, OK

Pero entonces, ¿cómo es que agregar0.1 cinco veces dará exactamente0.5? Se imprime el siguiente códigotrue:

double sum = 0, d = 0.1;
for (int i = 0; i < 5; i++)
    sum += d;
System.out.println(sum == 0.5); // Prints true, WHY?

Si0.1 no se puede representar exactamente, ¿cómo es que agregarlo 5 veces da exactamente0.5 que se puede representar con precisión?

Respuestas a la pregunta(3)

Su respuesta a la pregunta