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?



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

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

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.


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

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.


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é.


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

-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.


Il n'y a pas de fonctions globales en java, pour commencer.
Danon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.