127 votes

Arrondir à un entier avec Math.ceil en Java

int total = (int) Math.ceil(157/32);

Pourquoi est-ce que ça donne toujours 4 ? 157/32 = 4.90625 J'ai regardé autour de moi et cela semble être la bonne méthode.

J'ai essayé total comme double type, mais obtenir 4.0.

Qu'est-ce que je fais de mal ?

4voto

Scott Higgins Points 1

En Java, l'ajout d'un .0 en fera un double...

int total = (int) Math.ceil(157.0 / 32.0);

3voto

jorgenman Points 51

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.

2voto

Vitaliy Borisok Points 51

De même, pour convertir un nombre entier en nombre réel, vous pouvez ajouter un point :

int total = (int) Math.ceil(157/32.);

Et le résultat de (157/32.) sera également réel ;)

2voto

stones333 Points 1112
int total = (int) Math.ceil( (double)157/ (double) 32);

1voto

Un known Points 11

Vérifiez la solution ci-dessous pour votre question :

int total = (int) Math.ceil(157/32);

Ici, vous devez multiplier le numérateur par 1,0, et vous obtiendrez votre réponse.

int total = (int) Math.ceil(157*1.0/32);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X