Округлите двойное число до интервала, определяя шаг за шагом - PullRequest
0 голосов
/ 29 мая 2018

У меня есть некоторый абстрактный двойной интервал, определяемый по шагам, например:

0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 - where interval == 0.1

0.0, 0.25, 0.5, 0.75, 1.0 - where interval == 0.25

0.0, 0.5, 1.0 - where interval == 0.5

Поддерживает ли Javaесть какой-нибудь инструмент для «округления» некоторого двойного до ближайшего числа, в соответствии с интервалом?например:

0.511111 - to 0.5 в первом случае

0.599999 - to 0.6 в первом случае

0.511111 - to 0.5 во втором случае

0.599999 - to 0.5 во втором случае

0.711111 - to 0.75 во втором случае

0.744444 - to 0.5 в третьем случае

0.755555 - to 1.0 в третьем случае

0.92222 - to 1.0 в третьем случае

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Используйте BigDecimal и setScale() для округления.

Однако это не будет работать с точностью 0.25, но вы можете сделать обходной путь, что-то вроде этого:

public BigDecimal round( BigDecimal value, BigDecimal precision )
{
   return value.divide(precision, BigDecimal.ROUND_HALF_UP)
               .round(BigDecimal.ROUND_HALF_UP)
               .multiply(precision, BigDecimal.ROUND_HALF_UP);
}
0 голосов

В Java есть инструменты, которые могут округлять числа до n десятичных знаков, см. Как округлить число до n десятичных знаков в Java .Для округления до любого указанного вами интервала может потребоваться вручную использовать Math.round.

Формула:

При заданном интервале r и двойном значении x округлить, простая формула:

  • x_rounded = Math.round(x/r)*r;

Примеры:

double x = 0.59999;
double r = 0.25; // Quarters
x = Math.round(x/r)*r;
System.out.println(x); // Result is 0.5

double x = 0.59999;
double r = 0.1; // Tenths
x = Math.round(x/r)*r;
System.out.println(x); // Result is approximately 0.6

double x = 0.31421;
double r = 0.125; // Eighths
x = Math.round(x/r)*r;
System.out.println(x); // Result is exactly 0.375

Доказательство:

  • Интервал r можно рассматривать как значение дробной единицы.
    • Когда r = 0.25, дробная единица равна четверти.
  • Значение x/r представляет количество дробных единиц, составляющих x.
    • Когда x = 0.75, r = 0.25, x/r == 3, потому что x содержит три дробные единицы, то есть четверть.x/r представляет количество кварталов.
  • Math.round(x) округляет x до ближайшего целого значения.Аналогично, Math.round(x/r) округляет x/r до ближайшего целого числа, кратного этой дроби.
    • Для x = 0.7, r = 0.25 у нас есть x/r = 2.8, что составляет 2,8 квартала.Таким образом, Math.round(x/r) округляет значение до ближайшего квартала, 3 квартала.
  • Math.round(x/r)*r, поэтому округляет x до ближайшего дробного интервала r.Множитель необходим, потому что r является значением каждой дробной единицы.
    • Для x = 0.7, r = 0.25, Math.round(x/r) представляет 3 четверти.Его нужно умножить на r=0.25, чтобы получить округленное значение x.
...