En ce moment j'essaye ceci:
int a = round(n);
où n
est un double
mais il ne fonctionne pas. Qu'est-ce que je fais mal?
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);
Si vous n'aimez pas Math.round (), vous pouvez également utiliser cette approche simple:
int a = (int) (doubleVar + 0.5);
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.
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();
}
}
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.
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é.
public static int round(double d) {
if (d > 0) {
return (int) (d + 0.5);
} else {
return (int) (d - 0.5);
}
}