web-dev-qa-db-fra.com

Comment arrondir la division entière et obtenir résultat en Java?

Je viens d'écrire une petite méthode pour compter le nombre de pages d'un SMS sur un téléphone portable. Je n'ai pas eu l'option d'arrondir en utilisant Math.ceil, et honnêtement, cela semble très moche.

Voici mon code:

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
   String message = "today we stumbled upon a huge performance leak while optimizing a raycasting algorithm. Much to our surprise, the Math.floor() method took almost half of the calculation time: 3 floor operations took the same amount of time as one trilinear interpolation. Since we could not belive that the floor-method could produce such a enourmous overhead, we wrote a small test program that reproduce";

   System.out.printf("COunt is %d ",(int)messagePageCount(message));



}

public static double messagePageCount(String message){
    if(message.trim().isEmpty() || message.trim().length() == 0){
        return 0;
    } else{
        if(message.length() <= 160){
            return 1;
        } else {
            return Math.ceil((double)message.length()/153);
        }
    }
}

Je n'aime pas vraiment ce morceau de code et je cherche un moyen plus élégant de faire cela. Avec cela, je m'attends à 3 et non 3.0000000. Des idées?

67
black sensei

Pour arrondir une division entière, vous pouvez utiliser

import static Java.lang.Math.abs;

public static long roundUp(long num, long divisor) {
    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1);
    return sign * (abs(num) + abs(divisor) - 1) / abs(divisor);
}

ou si les deux chiffres sont positifs

public static long roundUp(long num, long divisor) {
    return (num + divisor - 1) / divisor;
}
93
Peter Lawrey

Utilisez Math.ceil() et convertissez le résultat en int:

  • C’est toujours plus rapide que d’éviter les doublons en utilisant abs ().
  • Le résultat est correct lorsque vous travaillez avec des négatifs, car -0,999 sera arrondi à 0.

Exemple: 

(int) Math.ceil((double)divident / divisor);
125
Roman

Une autre ligne qui n’est pas trop compliquée:

private int countNumberOfPages(int numberOfObjects, int pageSize) {
    return numberOfObjects / pageSize + (numberOfObjects % pageSize == 0 ? 0 : 1);
}

Pourrait utiliser long au lieu de int; il suffit de changer les types de paramètres et le type de retour.

31
popstr

La bibliothèque Google de Guava gère cela dans la classe IntMath :

IntMath.divide(numerator, divisor, RoundingMode.CEILING);

Contrairement à beaucoup de réponses ici, il gère les nombres négatifs. Il génère également une exception appropriée lors d'une tentative de division par zéro.

13
Stephen Ostermiller
(message.length() + 152) / 153

Cela donnera un entier "arrondi".

10
dee-see
long numberOfPages = new BigDecimal(resultsSize).divide(new BigDecimal(pageSize), RoundingMode.UP).longValue();
6
mekazu

Si vous voulez calculer une division par b arrondi, vous pouvez utiliser (a + (- a% b))/b

0
Jorge Fernández