Округление двойного, чтобы превратить его в int (java) - PullRequest
104 голосов
/ 16 апреля 2010

Прямо сейчас я пытаюсь это:

int a = round(n);

, где n - это double, но оно не работает. Что я делаю неправильно?

Ответы [ 8 ]

215 голосов
/ 16 апреля 2010

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

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

Итак, вам придется привести возвращаемое значение:

int a = (int) Math.round(doubleVar);
25 голосов
/ 15 января 2015

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

int a = (int) (doubleVar + 0.5);
11 голосов
/ 05 сентября 2012

округление двойное до "ближайшего" целое число как это:

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) </strong> по своему усмотрению.

3 голосов
/ 16 апреля 2010
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();
  }
}
2 голосов
/ 03 февраля 2018

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

int a=Math.round(1.7f);

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

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

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

1 голос
/ 19 февраля 2015

Документация Math.round гласит:

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

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

0 голосов
/ 07 октября 2016
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
0 голосов
/ 16 апреля 2010

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

...