Округлення двійника, щоб перетворити його на int (java)


120

Зараз я пробую це:

int a = round(n);

де nє, doubleале це не працює. Що я роблю неправильно?


можливий дублікат stackoverflow.com/questions/153724/…
Matt Ball

6
Вам слід справді детальніше «не працювати» більш детально. Що станеться? Що не відбувається? Що ви очікували? Які помилки ви мали? Чи є у вас round()метод у тому ж класі? Ти що import static java.lang.Math.*? І т.д. .. Існує маса способів округлення чисел, а отже, і безліч можливих відповідей. Іншими словами, ваше запитання є розпливчастим і неоднозначним і не може бути обґрунтовано відповісти в його теперішній формі. Це зйомка в темряві.
BalusC

1
Чи означає "не працює" означає не округлення до найближчого int, або викидання виключення, чи не округлення вгору / вниз? Це запитання марно без перехресного посилання на контекст з відповіддю.
modulitos

Відповіді:


239

Який тип повернення round()методу у фрагменті?

Якщо це Math.round()метод, він повертає Long, коли параметр введення подвійний.

Отже, вам доведеться віддати повернене значення:

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

1
Подумайте про використання Math.toIntExact (long) замість того, щоб просто вводити до int; подвійний може містити цілий діапазон значень, і ви, мабуть, не хочете мовчки викидати найзначніші біти, якщо ваш подвійний більший, ніж ви очікували.
othp

Я вважаю, що акторський склад не потрібен. Я не знаю, чи було це в минулому, але раунд повертається до int.
Випадання

@Dropout Math.round повертає int, якщо ви даєте йому поплавок, і довгий, якщо ви даєте йому подвійний.
Tur1ng

27

Якщо вам не подобається Math.round (), ви також можете скористатися цим простим підходом:

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

4
Там явно не цінний причина не подобається Math.round(): stackoverflow.com/a/6468757/1715716
Готьє Boaglio

3
Це рішення коротше, не потребує імпорту та переноситься на багато інших мов програмування з мінімальними змінами. І це може бути навіть швидше , в залежності від вашої платформи: stackoverflow.com/questions/12091014 / ...
д - р Даніель Thommes

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), як вам зручніше.


Я згоден з відповіддю анівалера. Але якщо вам потрібно просто округлити до найвищого цілого числа, вам може сподобатися нижче: подвійний десятковий номер = 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 перевантажена Коли вона отримує значення float, вона надасть вам int. Наприклад, це спрацювало б.

int a=Math.round(1.7f);

Коли він отримає подвійне значення, він дасть вам довгий, тому вам доведеться набрати його до int.

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

Це робиться для запобігання втрати точності. Подвійне значення - 64 біт, але тоді ваша змінна int може зберігати лише 32-бітну, тому вона просто перетворює її в довгу, яка є 64-бітовою, але ви можете ввести її в 32-бітну, як пояснено вище.


1

Документація Math.roundповідомлень:

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

Не потрібно робити це int. Можливо, це було змінено з минулого.


4
Існує 2 методи Math.round. Той, хто приймає поплавок, повертає ціле число, це правильно. Але той, що займає подвійний, повертає довго.
Домінік Еренберг


-1

Вам справді потрібно опублікувати більш повний приклад, щоб ми могли побачити, що ви намагаєтеся зробити. З того, що ви опублікували, ось що я бачу. По-перше, немає вбудованого round()методу. Вам потрібно або зателефонувати Math.round(n), або статично імпортувати Math.round, а потім зателефонувати, як у вас є.


Для початку у Java немає глобальних функцій.
Данон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.