Почему использование модуля по нецелым значениям теряет точность с плавающей точкой? [Дубликат]

На этот вопрос уже есть ответ здесь:

Почему я вижу двойную переменную, инициализированную некоторым значением, таким как 21.4, как 21.399999618530273? 14 ответов

Мне интересно, почему я теряю точность при использовании этого кода:

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 по модулю 1 должно равняться 0.0456, верно? Но это показывает немного другое значение, почему я продолжаю терять точность? Я имею в виду, что код должен вычитать ровно 1, пока значение не станет меньше 1.

Однако я нашел способ получить правильное значение:

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

Этот способ отлично работает, но у вас, ребята, есть лучшее решение?

Я неМне все равно, какой тип с плавающей запятой мне следует использовать, я просто хочу найти чистый способ получить правильное значение! Я неt, как необходимость преобразовать значение в двойное число, а затем в число с плавающей точкой.

Ответы на вопрос(1)

Ваш ответ на вопрос