Arredondando um duplo para transformá-lo em um int (java)


119

No momento, estou tentando isso:

int a = round(n);

onde nestá um, doublemas não está funcionando. O que estou fazendo de errado?



6
Você realmente deve elaborar "não funciona" com mais detalhes. O que acontece? O que não acontece? O que você esperava? Que erros você obteve? Você tem um round()método na mesma classe? Você fez import static java.lang.Math.*? Etc .. Existem muitas maneiras de arredondar os números e, portanto, também muitas respostas possíveis. Em outras palavras, sua pergunta é vaga e ambígua e não pode ser respondida de maneira razoável em sua forma atual. Está atirando no escuro.
BalusC

1
"Não está funcionando" significa não arredondar para o int mais próximo, ou lançar uma exceção, ou não arredondar para cima / para baixo? Esta pergunta é inútil sem ter que cruzar o contexto com a resposta.
modulitos

Respostas:


239

Qual é o tipo de retorno do round()método no snippet?

Se este for o Math.round()método, ele retornará um Long quando o parâmetro de entrada for Double.

Portanto, você terá que lançar o valor de retorno:

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

1
Considere usar Math.toIntExact (long) em vez de apenas lançar para um int; um double pode conter uma grande variedade de valores e você provavelmente não vai querer jogar fora os bits mais significativos se o seu double for maior do que o esperado.
othp 01 de

Acredito que o elenco não seja necessário. Não sei se foi no passado, mas round retorna int.
Desistência

@Dropout Math.round retorna um int se você der um float, e um long se você der um double.
Tur1ng

27

Se você não gosta de Math.round (), também pode usar esta abordagem simples:

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

4
Claramente não há motivo valioso para não gostar Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio

3
Essa solução é mais curta, não precisa de importação e é portátil para muitas outras linguagens de programação com alterações mínimas. E pode até ser mais rápido dependendo da sua plataforma: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes

1
Não estou criticando sua resposta, que considero muito útil pelo motivo que você mencionou. Eu estava, com esse comentário, me dirigindo a pessoas que teriam medo de usar Math.round(), o que faz "literalmente" o mesmo que a solução que você fornece, só isso. Felicidades.
Gauthier Boaglio

2
Sim, como nehz disse, acredito que isso seria em torno de -2,1 a -1, por exemplo.
Ben Aaronson de

5
@AlbertoHormazabal, você não percebeu que ele acrescentou 0.5?
Sasha

11

Arredondando duplo para o número inteiro "mais próximo" desta forma:

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;          
    }
}

Você pode alterar a condição (resultado <0,5) como preferir.


Eu concordo com a resposta do anivaler. Mas se você precisa apenas arredondar para o número inteiro mais alto, você pode escolher abaixo: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Saída: 5
Smeet de

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

A função Math.round está sobrecarregada. Quando ela recebe um valor flutuante, ela fornece um int. Por exemplo, isso funcionaria.

int a=Math.round(1.7f);

Quando ele recebe um valor duplo, ele lhe dará um long, portanto, você deve fazer o typecast para int.

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

Isso é feito para evitar perda de precisão. Seu valor duplo é 64 bits, mas sua variável int só pode armazenar 32 bits, então ela apenas converte para long, que é 64 bits, mas você pode fazer o typecast para 32 bits conforme explicado acima.


1

Documentação de Math.rounddiz:

Retorna o resultado do arredondamento do argumento para um número inteiro . O resultado é equivalente a (int) Math.floor(f+0.5).

Não há necessidade de lançar para int. Talvez tenha mudado do passado.


4
Existem 2 métodos Math.round. Aquele que leva um float retorna um inteiro, isso está correto. Mas aquele que leva um dobro retorna um longo.
Dominik Ehrenberg

0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}

-1

Você realmente precisa postar um exemplo mais completo, para que possamos ver o que você está tentando fazer. Pelo que você postou, aqui está o que posso ver. Primeiro, não existe um round()método embutido . Você precisa chamar Math.round(n)ou importar estaticamente Math.rounde, em seguida, chamá-lo como fez.


Para começar, não há funções globais em java.
Danon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.