Dlaczego używanie modulo w wartościach innych niż całkowite powoduje utratę precyzji zmiennoprzecinkowej? [duplikować]

To pytanie ma już tutaj odpowiedź:

Dlaczego widzę podwójną zmienną zainicjowaną na jakąś wartość, taką jak 21.4 jako 21.399999618530273? 14 odpowiedzi

Zastanawiam się, dlaczego tracę precyzję podczas używania tego kodu:

double x = 12.0456;    // or float : same result
System.out.println(x); // outputs 12.0456 obviously
x %= 1;                // should now be equal to 0.0456 right?
System.out.println(x); // outputs 0.04560000000000031 or 0.045599937 when using float

12.0456 modulo 1 powinno mieć wartość 0,0456, prawda? Ale pokazuje nieco inną wartość, dlaczego ciągle tracę precyzję? Chodzi mi o to, że kod powinien odjąć dokładnie 1, aż wartość będzie mniejsza niż 1.

Dowiedziałem się jednak, jak uzyskać poprawną wartość:

double x = 12.0456;
System.out.println(x);
x %= 1;
System.out.println((float)x); //outputs 0.0456 exactly

W ten sposób działa idealnie, ale czy macie lepsze rozwiązanie?

Nie obchodzi mnie, jaki typ zmiennoprzecinkowy powinienem użyć, chcę tylko znaleźć czysty sposób na uzyskanie poprawnej wartości! Nie lubię konwertować wartości na double, a potem na float.

questionAnswers(1)

yourAnswerToTheQuestion