Je travaille sur un système sur lequel le module math
n'est pas disponible. Toutes les fonctions "Math" installées ( math.ceil ()
, math.round ()
, etc. produisent toutes des erreurs).
J'ai même essayé d'utiliser import math
qui donne:
<type 'ImportError'> __import__ not found
Problème actuel qui me surprend: Comment puis-je faire un tour de calcul mathématique jusqu'à un nombre entier sans math.ceil
?
5 Réponses :
Si x
est un nombre flottant que vous voulez arrondir à un entier et que vous voulez un résultat de type entier, vous pouvez utiliser
rounded_up_x = int(-(-x // 1))
Cela fonctionne parce que la division entière par un arrondit vers le bas, mais l'utilisation du signe négatif avant et après la division arrondit la direction opposée. Le int
convertit ici le résultat float en entier. Supprimez ce int
si vous voulez une valeur à virgule flottante égale à un entier, ce que font certains langages de programmation.
Hat-tip à @ D.LaRocque pour avoir signalé que Python La fonction ceil ()
renvoie un type entier.
Il semble que math.ceil
renvoie int
à chaque fois, nous pouvons donc utiliser int (- (-x // 1))
pour éviter les zéros négatifs .
@ D.LaRocque: Merci beaucoup, j'ai corrigé ma réponse. Je suppose que j'étais confus par C ou Pascal, qui, je crois, renvoient un entier mais en virgule flottante.
oh, et ce que je n'ai pas réalisé avant la conversation sur les nombres entiers et les nombres flottants ... l'un de mes nombres dans le calcul a été stocké sous forme d'entier.
Bienvenue dans Stack.
Dans la mesure où je l'ai implémenté dans mes codes, vous n'avez pas besoin d ' importer des mathématiques
pour utiliser round ()
.
Parce que round ()
est une fonction autonome en python et non une extension du package math.
Donc, je vous suggère de continuer et d'utiliser simplement round ()
au lieu de math.round ()
et tout ira bien.
Consultez cette doc pour en savoir plus sur pour utiliser la fonction round ()
.
Qu'en est-il de ceil
? round ()
ne arrondit pas
round ()
ne arrondit pas vers le haut , ce que veut le questionneur.
Le plafond de x
est le plus petit entier supérieur ou égal à x
. Donc, ajoutez simplement 1 si la partie décimale de x
est différente de zéro.
Une manière simple serait:
print([myCeil(i) for i in [myCeil(i) for i in [-2, -1.1, -0.0, 0, 1, 1.2, 3]]) #[-2, -1, 0, 0, 1, 2, 3]
Exemples: p>
def myCeil(x): return int(x) + int((x>0) and (x - int(x)) > 0)
cela peut être simplement fait par le code suivant (c'est toujours comme ça que je fais). Aucune bibliothèque mathématique nécessaire
y = x si x == x // 1 autre tour (x + 0,5)
Cela ne fonctionne pas pour 0
, ni pour les nombres entiers en général. round (3 + 0.5) = 4
lorsque le résultat correct doit être 3
@pault: Dans mon Python 3.7.3, cela fonctionne pour zéro et toute valeur entière paire mais pas pour une valeur entière impaire. Cela est dû à l'arrondissement du banquier de round
, également appelé arrondi symétrique - il arrondit à l'entier pair le plus proche si la partie fractionnaire est de 0,5.
Cela peut ne pas fonctionner en python 2.7.x, mais fonctionnera en python 3.x.x
@KrishnaRao cela ne fonctionne pas pour les nombres impairs en python 3.6.5 ou 2.7
@pault Vous avez raison .. Je l 'ai vérifié maintenant .. c'est l' ancienne méthode que j'ai utilisée dans certains de mes outils précédents ... mais en python, le code de Rory est bon. Merci de l'avoir signalé.
Voici une façon de procéder. Je pense que cela devrait fonctionner dans la plupart des versions de python.
def ceil(n): q, r = divmod(n, 1) return int(q) + bool(r)
@pault: pourquoi ne fonctionnerait-il pas pour les entiers négatifs?
vérifier si
x - int (x)
est supérieur à 0? Donc quelque chose commeint (x) + (1 if x - int (x)> 0 else 0)
Que diriez-vous de
int (x // 1) + 1
?@ D.LaRocque qui ne fonctionne pas si
x
est déjà un entier.Vrai, utilisez
x if isinstance (x, int) else int (x // 1) + 1
ou utilisez la réponse de @Rory Daulton