Ce problème me tue. Comment arrondit-on un nombre UP en Python?
J'ai essayé d'arrondir (nombre) mais il arrondit le nombre. Exemple:
round(2.3) = 2.0 and not 3, what I would like
J'ai essayé int (nombre + 0,5) mais il arrondit à nouveau le nombre! Exemple:
int(2.3 + .5) = 2
Ensuite, j'ai essayé le tour (numéro + 0,5) mais cela ne fonctionnera pas dans les cas de bord. Exemple:
WAIT! THIS WORKED!
S'il vous plaît donnez votre avis.
python
floating-point
integer
rounding
python-2.x
Bodacydo
la source
la source
round(number + .5)
ne fonctionne pas si le nombre est entier.round(3+.5) == 4
, quand vous voulez vraiment3
.Réponses:
La ceil fonction (plafond):
la source
int(math.ceil(363))
math.ceil
retourne un objet entier réel, pas seulement un objet flottant avec une valeur entière.10000000 * 0.00136 = 13600.000000000002
plafond peut augmenter considérablementmath.ceil(10000000 * 0.00136) = 13601.0
Je sais que cette réponse est pour une question de tout à l'heure, mais si vous ne voulez pas importer de mathématiques et que vous voulez simplement arrondir, cela fonctionne pour moi.
La première partie devient 4 et la deuxième partie est évaluée à "True" s'il y a un reste, qui en plus True = 1; False = 0. Donc, s'il n'y a pas de reste, alors il reste le même entier, mais s'il y a un reste, il ajoute 1.
la source
//
pour la division entière, donc cela devient21 // 5 + (21 % 5 > 0)
.float
art inutile . Agréable.Problème intéressant de Python 2.x à garder à l'esprit:
Le problème est que la division de deux ints en python produit un autre entier et qui est tronqué avant l'appel du plafond. Vous devez faire une valeur flottante (ou cast) pour obtenir un résultat correct.
En javascript, le même code exact produit un résultat différent:
la source
Si vous travaillez avec des nombres entiers, une façon d'arrondir est de tirer parti du fait que l'arrondi est
//
bas: Faites simplement la division sur le nombre négatif, puis annulez la réponse. Aucune importation, virgule flottante ou conditionnelle nécessaire.Par exemple:
la source
(num + den - 1) // den
, ce qui est bien pour lesint
entrées avec des dénominateurs positifs, mais échoue si même un seul non-intégralfloat
est impliqué (soit le numérateur soit le dénominateur); c'est plus magique, mais ça marche pourint
s etfloat
s. Pour les petits numérateurs, c'est aussi plus rapide (sur CPython 3.7.2), bien que curieusement, lorsque seul le numérateur est suffisamment grand pour que des mathématiques basées sur les tableaux soient nécessaires, votre approche est plus lente; on ne sait pas pourquoi, car le travail de division devrait être similaire et deux négations unaires devraient être moins chères que l'addition + la soustraction.Vous aimerez aussi numpy:
Je ne dis pas que c'est mieux que les mathématiques, mais si vous utilisiez déjà numpy à d'autres fins, vous pouvez garder votre code cohérent.
Quoi qu'il en soit, juste un détail que j'ai rencontré. J'utilise beaucoup numpy et j'ai été surpris qu'il ne soit pas mentionné, mais bien sûr, la réponse acceptée fonctionne parfaitement.
la source
Utilisez
math.ceil
pour arrondir:REMARQUE : L'entrée doit être flottante.
Si vous avez besoin d'un entier, appelez-le
int
pour le convertir:BTW, utilisez
math.floor
pour arrondir vers le bas etround
arrondir à l'entier le plus proche.la source
ceil()
occupera en interneLa syntaxe n'est peut-être pas aussi pythonique qu'on pourrait le souhaiter, mais c'est une bibliothèque puissante.
https://docs.python.org/2/library/decimal.html
la source
Je suis surpris que personne ne l'ait suggéré
pour la division entière avec arrondi. Autrefois la voie commune pour C / C ++ / CUDA (cf.
divup
)la source
1
au lieu de le soustraire, ou inverser les signes du numérateur et du dénominateur avant d'effectuer les calculs.La valeur arrondie doit être flottante
mais
la source
Essaye ça:
la source
((int(a) - a) != 0)
expression revient1
chaque fois qu'ellea
doit être arrondie. Vous voudrez peut-être développer votre réponse et expliquer comment cela fonctionne.Cette fonction ne nécessite aucun module.
la source
3
, alors il arrondirait à4
ce que quelqu'un peut ou non vouloirLes réponses ci-dessus sont correctes, cependant, importer le
math
module juste pour cette seule fonction me semble généralement un peu exagéré. Heureusement, il existe une autre façon de procéder:True
etFalse
sont interprétés comme1
et0
dans une déclaration impliquant des nombres en python.g.is_interger()
se traduit essentiellement parg.has_no_decimal()
oug == int(g)
. La dernière déclaration en anglais se lit doncround g down and add one if g has decimal
.la source
int(g) + (g % 1 > 0)
place ;-)from math import ceil
semble résoudre l'import de l'ensemble du module mathématique :)import math
en termes de ce qui se passe dans les coulisses. Il supprime juste tous les symboles saufceil
.Sans importer math // en utilisant l'environnement de base:
a) méthode / méthode de classe
b) lambda:
la source
Pour ceux qui veulent arrondir
a / b
et obtenir un entier:Une autre variante utilisant la division entière est
la source
Si quelqu'un souhaite arrondir à une décimale spécifique:
la source
Je suis surpris de ne pas avoir encore vu cette réponse
round(x + 0.4999)
, alors je vais la poser. Notez que cela fonctionne avec n'importe quelle version de Python. Les modifications apportées au schéma d'arrondi Python ont rendu les choses difficiles. Voir cet article .Sans importer, j'utilise:
Pourquoi cela fonctionne
À partir des documents
Par conséquent, 2,5 est arrondi à 2 et 3,5 est arrondi à 4. Si ce n'était pas le cas, l'arrondi pourrait être effectué en ajoutant 0,5, mais nous voulons éviter d'arriver à mi-chemin. Donc, si vous ajoutez 0,4999, vous vous rapprocherez, mais avec suffisamment de marge pour être arrondi à ce que vous attendez normalement. Bien sûr, cela échouera si le
x + 0.4999
est égal à[n].5000
, mais cela est peu probable.la source
math.ceil()
?Without importing I use:
. J'ai également mentionné qu'il échouera si lex + 0.4999
est égal à[n].5000
.math
module et semath.ceil()
trouve dans la bibliothèque standard, donc disponible partout à toutes fins pratiques sans installer de trucs supplémentaires. Et en ce qui concerne votre mention de l'échec, cela est incomplet dans votre réponse, car il échoue pour un intervalle entier, pas seulement pour un seul point. Techniquement, vous pourriez affirmer que vous avez raison, comme vous le dites si et non siff , mais cela donnera l'impression au lecteur occasionnel qu'il est moins probable qu'il ne l'est vraiment.Pour le faire sans aucune importation:
la source
Je sais que cela remonte à un certain temps, mais j'ai trouvé une réponse assez intéressante, alors voici:
Cela corrige les cas de bords et fonctionne pour les nombres positifs et négatifs, et ne nécessite aucune importation de fonction
À votre santé
la source
-round(-x-0.3) = x
lorsque vous utilisez 4500/1000 en python, le résultat sera 4, car pour le python par défaut, asume comme entier le résultat, logiquement: 4500/1000 = 4.5 -> int (4.5) = 4 et le plafond de 4 est évidemment 4
en utilisant 4500 / 1000,0, le résultat sera 4,5 et un plafond de 4,5 -> 5
En utilisant javascript, vous recevrez 4.5 comme résultat de 4500/1000, car javascript n'assume que le résultat en "type numérique" et renvoie un résultat directement en float
Bonne chance!!
la source
/
entraîne toujours un flottant, donc4500/1000
toujours 4,5.Si vous ne voulez rien importer, vous pouvez toujours écrire votre propre fonction simple comme:
def RoundUP(num): if num== int(num): return num return int(num + 1)
la source
Vous pouvez utiliser la déviation du sol et y ajouter 1. 2,3 // 2 + 1
la source
ceil()
au lieu de faire bizarrement le contraire et ensuite compenserfrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Je pense que vous confondez les mécanismes de travail entre
int()
etround()
.int()
tronque toujours les nombres décimaux si un nombre flottant est donné; tandis queround()
, dans le cas2.5
où2
et3
sont tous deux à égale distance de2.5
, Python retourne celui qui est le plus éloigné du point 0.la source
2.3
est transformé en3
, ce qui ne se produit dans aucun de vos exemples.Mon partage
J'ai testé l'
print(-(-101 // 5)) = 21
exemple donné ci-dessus.Maintenant pour arrondir:
Je ne peux pas utiliser
**
donc je répartis le multiplier en division:la source
Je suis fondamentalement un débutant chez Python, mais si vous essayez simplement d'arrondir au lieu de descendre, pourquoi ne pas le faire:
la source
round(integer + 0.5)
dire que c'est ce que je fais souvent