Мне интересно, почему я теряю точность при использовании этого кода:
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
Этот способ работает отлично, но есть ли у вас решение получше?
Мне все равно, какой тип с плавающей запятой мне следует использовать, я просто хочу найти простой способ получить правильное значение! Мне не нравится преобразовывать значение в двойное, а затем в поплавок.
float
s иdouble
s просто не могут представлять любое произвольное действительное число. Если вам нужно поддерживать известную точность, используйтеBigDecimals
, но даже они имеют только произвольную точность, а не бесконечную точность. (Это может не иметь практического значения.) - person millimoose   schedule 10.02.2013