Java-функция для сохранения гранулярности
Мне нужно сохранить гранулярность в нечеткой работе, поэтому я сделал функцию, которая получает в качестве параметров:
- гранулярность (двойное число от 0 до 1, 0 не включено)
- значение для преобразования, если необходимо (это в два раза больше 0)
И возвращает новое значение с правильной гранулярностью.
Это функция, которую я имею:
public static double preserveGranularity(double granul, double value){
double integerValue= (double)(int)value;
if(granul == 1)
return integerValue;
double decimal = value - integerValue;
long factor = Math.round(decimal/granul);
return integerValue + granul*factor;
}
Примеры:
- preserveGranularity (0.25, 7.7) должен вернуть 7.75
- preserveGranularity (0.01, 0.009) должен вернуть 0.01
Он работает хорошо для большинства значений, но не для всех (например: preserveGranularity(0.2, 0.57)=0.6000000000000001, должен возвращать 0,6)
С уважением
PS Извините за любую ошибку, которую я сделал в этом вопросе, это мой первый здесь
2 ответа
Вы не можете достичь этого с double
- поскольку это не достаточно точно. double
с не реальные цифры. Существует только конечное число бит для их представления - в то время как существует бесконечное количество действительных (или даже рациональных) чисел, поэтому эти ошибки округления ожидаются.
Я думаю, что вы ищете BigDecimal
, который позволяет вам контролировать гранулярность, как вы хотите, например, с его round()
метод.
Вычисления с плавающей точкой не точны (компьютер может представлять только столько цифр). Это означает, что где-то в ваших операциях деления / умножения / округления / вычитания / сложения вы теряете точность.