Как округлить число с точностью до определенного диапазона? - PullRequest
6 голосов
/ 21 октября 2011

У меня есть такое значение:

421.18834

И мне нужно математически правильно округлить маску, которая может выглядеть следующим образом:

0.05
0.04
0.1

Например, если маска равна 0,04, мне нужно получить значение 421.20, потому что .18 ближе к .20, чем .16.

Все функции, которые я нашел с помощью Google, не работали.

Не могли бы вы мне помочь?

Ответы [ 4 ]

9 голосов
/ 21 октября 2011
double initial = 421.18834;
double range = 0.04;

int factor = Math.round(initial / range); // 10530 - will round to correct value

double result = factor * range; // 421.20
3 голосов
/ 21 октября 2011

Вам не нужна специальная функция. Вы умножаете свое исходное число на (1 / маска), округляете его до десятичного знака и снова делите на тот же коэффициент.

  • Пример с 0,05

    factor = 1/0.05 = 20
    421.18834 * 20 =  8423.7668
    int(  8423.7668 ) = 8424
    8424.0 / 20.0 = 421.20
    
  • Пример с 0,01

    factor = 1/0.1 = 10
    421.18834 * 10 = 4211.8834
    int( 4211.8834 ) = 4212
    4212.0 / 10.0 = 421.20
    
2 голосов
/ 22 октября 2011

Вопреки всем ответам, которые вы, вероятно, получите здесь о умножении и делении, вы не можете сделать это точно, потому что с плавающей запятой нет десятичных знаков.Чтобы преобразовать в десятичное число, а затем округлить.BigDecimal делает это.

2 голосов
/ 21 октября 2011

И Фредли, и Маттео делают предположение, что коэффициент округления сам по себе равен 100. Для таких факторов, как 0,06 или 0,07, это неверное предположение.

Вот моя рутина Java:

public double rounded(double number, double factor) {
    long integer = (long) number;
    double fraction = number - integer;
    double multiple = (fraction / factor);
    multiple = Math.round(multiple);
    return factor * multiple + integer;
} 
...