Vous faites 157/32
qui consiste à diviser deux entiers l'un par l'autre, ce qui donne toujours un entier arrondi vers le bas. Par conséquent, le (int) Math.ceil(...)
ne fait rien. Il y a trois solutions possibles pour obtenir ce que vous voulez. I recommander en utilisant soit option 1 o option 2 . S'il vous plaît, faites PAS utiliser option 0 .
Option 0
Convertir a
y b
en un double, et vous pouvez utiliser la division et le Math.ceil
comme vous vouliez qu'il fonctionne. Cependant, je déconseille fortement l'utilisation de cette approche, car la double division peut être imprécise. Pour en savoir plus sur l'imprécision des doubles, voir cette question .
int n = (int) Math.ceil((double) a / b));
Option 1
int n = a / b + ((a % b == 0) ? 0 : 1);
Tu le fais. a / b
avec toujours un plancher si a
y b
sont tous deux des entiers. Ensuite, vous avez une instruction if en ligne qui vérifie si vous devez ou non utiliser ceil au lieu de floor. Donc +1 ou +0, s'il y a un reste avec la division, il faut +1. a % b == 0
des chèques pour le reste.
Option 2
Cette option est très courte, mais peut-être pour certains moins intuitive. Je pense que cette approche moins intuitive serait plus rapide que l'approche par double division et comparaison :
Veuillez noter que cela ne fonctionne pas pour b < 0
.
int n = (a + b - 1) / b;
Pour réduire les risques de débordement, vous pouvez utiliser la méthode suivante. Cependant, notez que cela ne fonctionne pas pour les fichiers a = 0
y b < 1
.
int n = (a - 1) / b + 1;
Explication de l'"approche moins intuitive".
Étant donné que la division de deux nombres entiers en Java (et dans la plupart des autres langages de programmation) donne toujours un résultat plancher. Donc :
int a, b;
int result = a/b (is the same as floor(a/b) )
Mais nous ne voulons pas floor(a/b)
mais ceil(a/b)
et en utilisant les définitions et les graphiques de Wikipedia :
Avec ces tracés de la fonction plancher et plafond, vous pouvez voir la relation.
Vous pouvez voir que floor(x) <= ceil(x)
. Nous avons besoin floor(x + s) = ceil(x)
. Nous devons donc trouver s
. Si nous prenons 1/2 <= s < 1
il sera juste (essayez quelques chiffres et vous verrez que c'est le cas, j'ai moi-même du mal à le prouver). Et 1/2 <= (b-1) / b < 1
donc
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
Ce n'est pas une preuve réelle, mais j'espère que vous en êtes satisfait. Si quelqu'un peut mieux l'expliquer, je l'apprécierais aussi. Demandez-le peut-être sur MathOverflow .