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() метод.

Вычисления с плавающей точкой не точны (компьютер может представлять только столько цифр). Это означает, что где-то в ваших операциях деления / умножения / округления / вычитания / сложения вы теряете точность.

Другие вопросы по тегам