Comment pourrais-je toujours arrondir une double
à une int
, et ne jamais l'arrondir vers le bas ... je sais Math.round(double)
, mais je veux qu'il soit toujours arrondi .. Donc si c'était 3.2
, il est arrondi à 4.
Vous pouvez utiliser la méthode Math.ceil()
.
Voir le lien JavaDoc: https://docs.Oracle.com/javase/10/docs/api/Java/lang/Math.html#ceil(double)
De la docs:
ceil
public static double ceil(double a)
Renvoie la plus petite valeur double (la plus proche de l'infini négatif) supérieure ou égale à l'argument et égale à un entier mathématique. Cas spéciaux:
Notez que la valeur de Math.ceil (x) est exactement la valeur de -Math.floor (-x).
Paramètres:
Résultats:
La plus petite valeur en virgule flottante (la plus proche de l'infini négatif) supérieure ou égale à l'argument et égale à un entier mathématique.
En des mots simples,
Math.ceil
sera toujours arrondi UP ou comme indiqué ci-dessus, en excès. Math.round
arrondira de haut en bas en fonction des décimales .Exemples de Math.ceil
et Math.round
:
Le code ci-dessous renverrait:
Coût, sans Ceil 2.2 et avec Ceil 3 (int), 3.0 (double). Si on l'arrondit: 2
int m2 = 2200;
double rate = 1000.0;
int costceil = (int)Math.ceil(m2/rate);
double costdouble = m2/rate;
double costdoubleceil = Math.ceil(m2/rate);
int costrounded = (int)Math.round(m2/rate);
System.out.println("Cost, without Ceil "+costdouble+" and with Ceil "+
costceil+"(int), "+costdoubleceil+"(double). If we round it: "+costrounded);
Si nous modifions la valeur de m2 par exemple 2499, le résultat serait: Coût, sans Ceil 2,499 et avec Ceil 3 (int), 3,0 (double). Si on l'arrondit: 2
Si nous remplaçons m2 par exemple par 2550, le résultat serait:
Coût, sans Ceil 2,55 et avec Ceil 3 (int), 3,0 (double). Si on l'arrondit: 3
J'espère que ça aide. (Informations extraites des réponses précédentes, je voulais juste que ce soit plus clair).
Ma méthode est relativement simple, espérons que cela fonctionne pour vous.
Dans mon cas, j'ai une rangée d'objets qui ne peuvent contenir que 3 éléments et je dois ajuster le nombre de lignes dont je dispose pour accueillir les éléments.
Donc, j'ai un certain nombre numberOfRows, j'utilise ensuite numberOfRows.intValue () pour obtenir une valeur int pour numberOfRows.
si la valeur int que je reçois est inférieure à numberOfRows, j'ajoute 1 à numberOfRows pour l'arrondir, sinon la valeur que je récupère de numberOfRows.intValue () est la réponse que je veux.
J'ai écrit cette simple boucle pour le tester:
for(int numberOfItems = 0; numberOfItems < 16; numberOfItems++) {
Double numberOfRows = numberOfItems / 3.0;
System.out.println("Number of rows are: " + numberOfRows);
System.out.println("Number of items are: " + numberOfItems);
if(numberOfRows.intValue() < numberOfRows) {
System.out.println("int number of rows are: " + (numberOfRows.intValue() + 1));
}
else {
System.out.println("int value of rows are: " + numberOfRows.intValue());
}
System.out.println();
System.out.println();
}
private int roundUP(double d){
double dAbs = Math.abs(d);
int i = (int) dAbs;
double result = dAbs - (double) i;
if(result==0.0){
return (int) d;
}else{
return (int) d<0 ? -(i+1) : i+1;
}
}
Bon travail ! ;)
BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )
4
BigDecimal
Si vous voulez précision plutôt que performance , évitez virgule flottante technologie. Cela signifie éviter float
, Float
, double
, Double
. Pour plus de précision, utilisez BigDecimal
class.
Sur BigDecimal
, définissez l'échelle , le nombre de chiffres à droite de la décimale. Si vous ne voulez pas de fraction décimale, définissez l'échelle sur zéro. Et spécifiez un mode d'arrondi . Pour toujours arrondir une fraction vers le haut, utilisez RoundingMode.CEILING
, documenté comme suit:
Mode d'arrondi pour arrondir vers l'infini positif. Si le résultat est positif, se comporte comme pour RoundingMode.UP; si négatif, se comporte comme pour RoundingMode.DOWN. Notez que ce mode d'arrondi ne diminue jamais la valeur calculée. Ainsi, par exemple, 1.1 devient 2 et votre 3.2 devient 4.
BigDecimal bd = new BigDecimal( "3.2" ) ;
BigDecimal bdRounded = bd.setScale( 0 , RoundingMode.CEILING ) ;
String output = bdRounded.toString() ;
System.out.println( "bdRounded.toString(): " + bdRounded ) ; // 4
4
Voir ce code exécuté en direct sur IdeOne.com .
Petit exemple sans utiliser Math.ceil ().
public double roundUp(double d){
return d > (int)d ? (int)d + 1 : d;
}
Exaplanation: Comparez l'opérande arrondi à l'opérande arrondi à l'aide de la conversion de type, si le retour est plus grand, argument arrondi à la baisse + 1 (signifie arrondi supérieur), sinon opérande inchangé.
Exemple en pseudocode
double x = 3.01
int roundDown = (int)x // roundDown = 3
if(x > roundDown) // 3.01 > 3
return roundDown + 1 // return 3.0 + 1.0 = 4.0
else
return x // x equals roundDown
Quoi qu'il en soit, vous devriez utiliser Math.ceil()
. Ceci est seulement censé être un exemple simple de la façon dont vous pourriez le faire vous-même.