Почему использование модуля по нецелым значениям теряет точность с плавающей точкой? [Дубликат]
На этот вопрос уже есть ответ здесь:
Почему я вижу двойную переменную, инициализированную некоторым значением, таким как 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
Этот способ отлично работает, но у вас, ребята, есть лучшее решение?
Мне все равно, какой тип с плавающей точкой мне следует использовать, я просто хочу найти чистый способ получить правильное значение! Мне не нравится преобразовывать значение в двойное число, а затем в число с плавающей точкой.