Округление двойного числа, чтобы превратить его в int (java)


120

Прямо сейчас я пробую это:

int a = round(n);

где nнаходится, doubleно он не работает. Что я делаю не так?


возможный дубликат stackoverflow.com/questions/153724/…
Мэтт Болл,

6
Вам действительно стоит более подробно описать «не работает». Что случается? Что не бывает? Чего ты ожидал? Какие ошибки у вас были? У вас есть round()метод в том же классе? А ты import static java.lang.Math.*? И т. Д. Есть много способов округлить числа и, следовательно, много возможных ответов. Другими словами, ваш вопрос расплывчатый и неоднозначный, и на него нельзя дать разумного ответа в его нынешней форме. Стрельба в темноте.
BalusC

1
Означает ли «не работает» не округление до ближайшего целого числа, выдача исключения или не округление вверх / вниз? Этот вопрос бесполезен без перекрестной ссылки на контекст с ответом.
modulitos

Ответы:


239

Какой тип возврата round()метода во фрагменте?

Если это Math.round()метод, он возвращает Long, когда входным параметром является Double.

Итак, вам нужно будет указать возвращаемое значение:

int a = (int) Math.round(doubleVar);

1
Рассмотрите возможность использования Math.toIntExact (long) вместо простого преобразования в int; double может содержать довольно широкий диапазон значений, и вы, вероятно, не захотите молча выбрасывать наиболее значимые биты, если ваш double больше, чем вы ожидаете.
othp 01

Я считаю, что гипс не нужен. Я не знаю, было ли это в прошлом, но round действительно возвращает int.
выпадение

@Dropout Math.round возвращает int, если вы даете ему float, и long, если вы даете ему double.
Tur1ng

27

Если вам не нравится Math.round (), вы также можете использовать этот простой подход:

int a = (int) (doubleVar + 0.5);

4
Очевидно, что нет никакой Math.round()
уважительной

3
Это решение короче, не требует импорта и переносимо на многие другие языки программирования с минимальными изменениями. И это может быть даже быстрее, в зависимости от вашей платформы: stackoverflow.com/questions/12091014/…
Д-р Дэниел Томмес,

1
Я не критикую ваш ответ, который считаю очень полезным по той причине, которую вы упомянули. Этим комментарием я обращался к людям, которые боялись бы использовать Math.round(), что делает «буквально» то же самое, что и решение, которое вы предлагаете, вот и все. Приветствия.
Готье Боальо,

2
Да, как сказал nehz, я считаю, что это округлит от -2,1 до -1, например.
Бен Ааронсон

5
@AlbertoHormazabal, вы не заметили, что он добавил 0.5?
Саша

11

Округление двойного до «ближайшего» целого числа следующим образом:

1,4 -> 1

1,6 -> 2

-2,1 -> -2

-1,3 -> -1

-1,5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

Вы можете изменить условие (результат <0,5) по своему усмотрению.


Я согласен с ответом анивалера. Но если вам нужно просто округлить до максимального целого числа, вы можете сделать следующее: double decimalNumber = 4.56777; System.out.println (новый Float (Math.round (decimalNumber))); Результат: 5
Встреча

3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

3

Функция Math.round перегружена. Когда она получает значение с плавающей запятой, она выдаст вам int. Например, это сработает.

int a=Math.round(1.7f);

Когда он получает значение типа double, он дает вам long, поэтому вам нужно привести его к типу int.

int a=(int)Math.round(1.7);

Это сделано для предотвращения потери точности. Ваше двойное значение - 64-битное, но тогда ваша переменная int может хранить только 32-битную, поэтому она просто преобразует ее в long, которая является 64-битной, но вы можете привести ее к 32-битной, как описано выше.


1

В документации Math.roundговорится:

Возвращает результат округления аргумента до целого числа . Результат эквивалентен (int) Math.floor(f+0.5).

Нет необходимости переводить в int. Может быть, это было изменено по сравнению с прошлым.


4
Есть 2 метода Math.round. Тот, который принимает число с плавающей запятой, возвращает целое число, это правильно. Но тот, что берет дубль, возвращает долгое время.
Доминик Эренберг


-1

Вам действительно нужно опубликовать более полный пример, чтобы мы могли видеть, что вы пытаетесь сделать. Из того, что вы опубликовали, я вижу вот что. Во-первых, нет встроенного round()метода. Вам нужно либо вызвать Math.round(n), либо статически импортировать Math.round, а затем вызвать его, как и у вас.


Для начала, в java нет глобальных функций.
Danon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.