web-dev-qa-db-fra.com

Arrondir un double pour le transformer en int (Java)

En ce moment j'essaye ceci:

int a = round(n);

n est un double mais il ne fonctionne pas. Qu'est-ce que je fais mal?

105
David

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

S'il s'agit de la méthode Math.round(), elle renvoie une valeur Long lorsque le paramètre d'entrée est Double.

Donc, vous devrez lancer la valeur de retour:

int a = (int) Math.round(doubleVar);
217
Mihir Mathuria

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

int a = (int) (doubleVar + 0.5);
25
Dr. Daniel Thommes

Arrondir double au "plus proche" entier comme ceci:

1.4 -> 1

1.6 -> 2

- 2.1 -> - 2

- 1. -> - 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 changer la condition (résultat <0.5) comme vous préférez.

11
valerybodak
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
Scott

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

int a=Math.round(1.7f);

Quand il reçoit une valeur double, il vous en donne une longue, vous devez donc le transtyper en int.

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

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

2
Divyansh Rai

La documentation de Math.round dit:

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

Pas besoin de transtyper en int. Peut-être que cela avait changé du passé.

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