Obtenir la valeur entière supérieure suivante en java
je sais que je peux utiliser les maths.fonctions java pour obtenir la valeur floor, ceil ou round pour un double ou float, mais ma question Est -- est-il possible d'obtenir toujours la valeur entière plus élevée si un point décimal vient dans ma valeur
par exemple
int chunkSize = 91 / 8 ;
qui sera égal à 11.375
si j'applique le plancher, ceil ou rond à ce nombre il retournera 11 je veux 12.
si j'en ai 11.xxx I j'ai besoin de 12, si j'en AI 50.xxx je veux 51
Désolé de L'chunkSize doit être de type int
Comment puis-je y parvenir?
4 réponses
Math.ceil()
fera le travail.
mais, votre hypothèse que 91 / 8
est 11.375
est fausse.
En java, integer division renvoie la valeur integer de la division (11 dans votre cas).
pour obtenir la valeur float, vous devez lancer (ou ajouter .0) à l'un des arguments:
float chunkSize = 91 / 8.0 ;
Math.ceil(chunkSize); // will return 12!
ceil est censé faire exactement cela. Je cite:
renvoie la plus petite (la plus proche de l'infini négatif) valeur double que est supérieur ou égal à l'argument et est égale à un mathématiques entier.
EDIT: (merci à Peter Lawrey): prendre un autre regard sur votre code, vous avez un autre problème. Vous stockez le résultat de la division entière dans une variable float: float chunkSize = 91 / 8 ;
java regarde les arguments de la division et comme ils sont tous les deux entiers il effectue la division entière ainsi le résultat est de nouveau un entier (le résultat de la division arrondie vers le bas). Maintenant, même si vous assignez ceci au flotteur chunkSize
, ce sera toujours un entier(manquant la partie double) et ceil, round et floor retourneront tous la même valeur. Pour éviter cela, ajouter un .0
à 91
: float chunkSize = 91.0 / 8;
. Cela rend l'un des arguments double précision et donc double division sera effectuée, retournant un double résultat.
si vous voulez faire la division entière arrondissant vers le haut vous pouvez faire
x / y
arrondi, en supposant que x et y soient positifs
long div = (x + y - 1) / y;
dans votre cas
(91 + 8 - 1) / 8 = 100 / 8 = 12
cela fonctionne parce que vous voulez arrondir (ajouter un) pour chaque valeur sauf un multiple exact (ce qui est pourquoi vous ajoutez y - 1
)
tout D'abord, quand vous écrivez float chunkSize = 91 / 8 ;
il affichera 11.0 au lieu de 11.375
parce que les valeurs 91 et 8 sont des valeurs de type int. Pour que le résultat soit la valeur décimale, soit le dividende ou le diviseur
ou les deux doivent être de type décimal. Donc, float chunkSize = 91.0 / 8;
résultera 11.375 et
maintenant, vous pouvez appliquer les Mathématiques.ceil() pour obtenir la valeur supérieure. Math.ceil(chunkSize);
donnera 12.0