Arrondir un double pour le transformer en int (java)

119

En ce moment j'essaye ceci:

int a = round(n);

nest un doublemais ça ne marche pas. Qu'est-ce que je fais mal?

David
la source
duplication possible de stackoverflow.com/questions/153724/…
Matt Ball
6
Vous devriez vraiment élaborer plus en détail «ne fonctionne pas». Ce qui se produit? Qu'est-ce qui ne se passe pas? Qu'est-ce que vous attendiez? Quelles erreurs avez-vous? Avez-vous une round()méthode dans la même classe? Avez-vous import static java.lang.Math.*? Etc .. Il y a beaucoup de manières d'arrondir les nombres et donc aussi beaucoup de réponses possibles. En d'autres termes, votre question est vague et ambiguë et ne peut pas être raisonnablement répondu dans sa forme actuelle. Il tourne dans le noir.
BalusC
1
Est-ce que "ne fonctionne pas" signifie ne pas arrondir à l'entier le plus proche, ou lancer une exception, ou ne pas arrondir vers le haut / bas? Cette question est inutile sans avoir à croiser le contexte avec la réponse.
modulitos du

Réponses:

239

Quel est le type de retour de la round()méthode dans l'extrait de code?

Si c'est la Math.round()méthode, elle renvoie un Long lorsque le paramètre d'entrée est Double.

Donc, vous devrez convertir la valeur de retour:

int a = (int) Math.round(doubleVar);
Mihir Mathuria
la source
1
Pensez à utiliser Math.toIntExact (long) au lieu de simplement convertir en un entier; un double peut contenir toute une gamme de valeurs et vous ne voudrez probablement pas jeter silencieusement les bits les plus significatifs si votre double est plus grand que prévu.
othp
Je pense que le casting n'est pas nécessaire. Je ne sais pas si c'était dans le passé, mais round renvoie int.
Abandon
@Dropout Math.round renvoie un int si vous lui donnez un flottant, et un long si vous lui donnez un double.
Tur1ng
27

Si vous n'aimez pas Math.round (), vous pouvez également utiliser cette approche simple:

int a = (int) (doubleVar + 0.5);
Dr Daniel Thommes
la source
4
Il n'y a clairement aucune raison valable de ne pas aimer Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio
3
Cette solution est plus courte, ne nécessite pas d'importation et est portable dans de nombreux autres langages de programmation avec des modifications minimes. Et cela pourrait même être plus rapide en fonction de votre plateforme: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes
1
Je ne critique pas votre réponse, que je trouve très utile pour la raison que vous évoquez. J'étais, par ce commentaire, m'adressant à des gens qui auraient peur d'utiliser Math.round(), ce qui fait «littéralement» la même chose que la solution que vous proposez, c'est tout. À votre santé.
Gauthier Boaglio
2
Oui, comme nehz l'a dit, je pense que cela arrondirait -2,1 à -1, par exemple.
Ben Aaronson
5
@AlbertoHormazabal, n'avez-vous pas remarqué qu'il a ajouté 0.5?
Sasha
11

Arrondir le double à l' entier "le plus proche" comme ceci:

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

Vous pouvez modifier la condition (résultat <0,5) à votre guise.

valerybodak
la source
Je suis d'accord avec la réponse de l'anivaleur. Mais si vous devez simplement arrondir au nombre entier le plus élevé, vous pouvez aimer ci-dessous: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Sortie: 5
Smeet
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();
  }
}
Scott
la source
3

La fonction Math.round est surchargée Lorsqu'elle reçoit une valeur flottante, elle vous donnera un int. Par exemple, cela fonctionnerait.

int a=Math.round(1.7f);

Quand il reçoit une valeur double, il vous donnera un long, donc vous devez le transtyper en int.

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

Ceci est fait pour éviter une perte de précision. Votre double valeur est de 64 bits, mais votre variable int ne peut stocker que 32 bits, elle la convertit donc simplement en long, qui est de 64 bits, mais vous pouvez la convertir en 32 bits comme expliqué ci-dessus.

Divyansh Rai
la source
1

La documentation de Math.rounddit:

Renvoie le résultat de l'arrondi de l'argument à un entier . Le résultat est équivalent à (int) Math.floor(f+0.5).

Pas besoin de lancer int. Peut-être que cela a changé par rapport au passé.

voyou-gamer
la source
4
Il existe 2 méthodes Math.round. Celui qui prend un flottant renvoie un entier, c'est correct. Mais celui qui prend un double renvoie un long.
Dominik Ehrenberg
0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
Alexandre Cyberman
la source
-1

Vous devez vraiment publier un exemple plus complet pour que nous puissions voir ce que vous essayez de faire. D'après ce que vous avez publié, voici ce que je peux voir. Premièrement, il n'y a pas de round()méthode intégrée . Vous devez soit appeler Math.round(n), soit importer statiquement Math.round, puis l'appeler comme vous l'avez fait.

Joey Gibson
la source
Il n'y a pas de fonctions globales en java, pour commencer.
Danon