Lors de la division de deux nombres entiers, par exemple,
int c = (int) a / (int) b;
le résultat est un int
dont la valeur est a
divisé par b
arrondis à zéro. Parce que le résultat est déjà arrondi, ceil()
ne fait rien. Notez que cet arrondi n'est pas la même chose que floor()
qui s'arrondit vers l'infini négatif. Donc, 3/2
est égal à 1
(et floor(1.5)
est égal à 1.0
mais (-3)/2
est égal à -1
(mais floor(-1.5)
est égal à -2.0
).
Ceci est important car si a/b
étaient toujours les mêmes que floor(a / (double) b)
alors vous pourriez simplement mettre en œuvre ceil()
de a/b
comme -( (-a) / b)
.
La suggestion d'obtenir ceil(a/b)
de
int n = (a + b - 1) / b;
ce qui est équivalent à a / b + (b - 1) / b
o (a - 1) / b + 1
fonctionne car ceil(a/b)
est toujours supérieur d'une unité à floor(a/b)
sauf lorsque a/b
est un nombre entier. Vous voulez donc le faire passer au nombre entier suivant (ou le dépasser), sauf si a/b
est un nombre entier. Additionner 1 - 1 / b
le fera. Pour les nombres entiers, il ne les fera pas passer au nombre entier suivant. Pour tout le reste, il le fera.
Oups. J'espère que ça a un sens. Je suis sûr qu'il y a une façon plus élégante mathématiquement de l'expliquer.