1
votes

Arrondir un calcul mathématique, sans math.ceil ()?

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?


4 commentaires

vérifier si x - int (x) est supérieur à 0? Donc quelque chose comme int (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


5 Réponses :


3
votes

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.


3 commentaires

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.



-4
votes

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 () .


2 commentaires

Qu'en est-il de ceil ? round () ne arrondit pas


round () ne arrondit pas vers le haut , ce que veut le questionneur.



1
votes

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)


0 commentaires

-1
votes

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)


5 commentaires

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é.



1
votes

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)


1 commentaires

@pault: pourquoi ne fonctionnerait-il pas pour les entiers négatifs?