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:
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:
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
privateint 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.*;publicclassTestRound11{publicstaticvoid main(String args[]){double d =3.1537;BigDecimal bd =newBigDecimal(d);
bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);// output is 3.15System.out.println(d +" : "+ round(d,2));// output is 3.154System.out.println(d +" : "+ round(d,3));}publicstaticdouble 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 =newBigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);return bd.doubleValue();}}
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.
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.
round()
método na mesma classe? Você fezimport 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.Respostas:
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:
fonte
Se você não gosta de Math.round (), também pode usar esta abordagem simples:
fonte
Math.round()
: stackoverflow.com/a/6468757/1715716Math.round()
, o que faz "literalmente" o mesmo que a solução que você fornece, só isso. Felicidades.0.5
?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
Você pode alterar a condição (resultado <0,5) como preferir.
fonte
fonte
A função Math.round está sobrecarregada. Quando ela recebe um valor flutuante, ela fornece um int. Por exemplo, isso funcionaria.
Quando ele recebe um valor duplo, ele lhe dará um long, portanto, você deve fazer o typecast para int.
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.
fonte
Documentação de
Math.round
diz:Não há necessidade de lançar para
int
. Talvez tenha mudado do passado.fonte
fonte
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 chamarMath.round(n)
ou importar estaticamenteMath.round
e, em seguida, chamá-lo como fez.fonte