Comment vérifier si une valeur flottante est un nombre entier

J'essaie de trouver la plus grande racine cubique qui est un nombre entier, c'est-à-dire moins de 12 000.

processing = True
n = 12000
while processing:
    n -= 1
    if n ** (1/3) == #checks to see if this has decimals or not

Je ne sais pas comment vérifier si c'est un nombre entier ou non! Je pourrais le convertir en une chaîne puis utiliser l'indexation pour vérifier les valeurs de fin et voir si elles sont nulles ou non, cela semble plutôt lourd cependant. Est-il un moyen plus simple?

123
demandé sur Martijn Pieters 2014-02-05 21:06:10

11 réponses

Pour vérifier si une valeur float est un nombre entier, utilisez la float.is_integer() méthode:

>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False

La méthode a été ajoutée au type float dans Python 2.6.

Prenez en compte que dans Python 2, 1/3 est 0 (division de plancher pour les opérandes entiers!), et cette arithmétique à virgule flottante peut être imprécise (a float est une approximation utilisant des fractions binaires, Pas un nombre réel précis). Mais en ajustant un peu votre boucle, cela donne:

>>> for n in range(12000, -1, -1):
...     if (n ** (1.0/3)).is_integer():
...         print n
... 
27
8
1
0

Ce qui signifie que tout ce qui dépasse 3 cubes, (y compris 10648) a été manqué en raison de l'imprécision susmentionnée:

>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996

Vous devrez vérifier les nombres fermer au nombre entier à la place, ou ne pas utiliser float() pour trouver votre numéro. Comme arrondir la racine cubique de 12000:

>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648

Si vous utilisez Python 3.5 ou plus récent, vous pouvez utiliser math.isclose() fonction pour voir si une valeur à virgule flottante est dans une marge configurable:

>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True

Pour les anciennes versions, le naïf implémentation de cette fonction (Ignorer la vérification des erreurs et ignorer infinity et NaN) Comme mentionné dans PEP485 :

def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
    return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
231
répondu Martijn Pieters 2016-06-10 19:15:06

Nous pouvons utiliser l'opérateur modulo ( % ). Cela nous indique combien de restes nous avons quand nous divisons x Par y-exprime comme x % y. Chaque nombre entier doit diviser par 1, donc si il y a un reste, il ne doit pas être un nombre entier.

Cette fonction retourne un booléen, True ou False, selon que n est un nombre entier.

def is_whole(n):
    if n % 1 == 0:
        return True
    else:
        return False
15
répondu MagikCow 2016-08-30 13:56:45

Vous pouvez utiliser ceci:

if k == int(k):
    print(str(k) + "is a whole number!"
11
répondu Juri Robl 2014-02-05 17:09:38

Vous pouvez utiliser une opération modulo pour cela.

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")
6
répondu Jakub Jirutka 2014-02-05 17:16:00

Vous n'avez pas besoin de faire une boucle ou de vérifier quoi que ce soit. Il suffit de prendre une racine cubique de 12 000 et de l'arrondir:

r = int(12000**(1/3.0))
print r*r*r # 10648
6
répondu georg 2014-02-05 17:22:31

Ne serait-il pas plus facile de tester les racines du cube? Commencez avec 20 (20**3 = 8000) et aller jusqu'à 30 (30**3 = 27000). Ensuite, vous devez tester moins de 10 entiers.

for i in range(20, 30):
    print("Trying {0}".format(i))
    if i ** 3 > 12000:
        print("Maximum integral cube root less than 12000: {0}".format(i - 1))
        break
5
répondu hughdbrown 2014-02-05 17:11:47

Que diriez-vous de

if x%1==0:
    print "is integer"
3
répondu Daniel 2015-01-14 08:56:23

Les réponses ci-dessus fonctionnent dans de nombreux cas, mais elles en manquent. Considérez ce qui suit:

fl = sum([0.1]*10)  # this is 0.9999999999999999, but we want to say it IS an int

En utilisant ceci comme référence, certaines des autres suggestions n'obtiennent pas le comportement que nous pourrions vouloir:

fl.is_integer() # False

fl % 1 == 0     # False

Essayez plutôt:

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

def is_integer(fl):
    return isclose(fl, round(fl))

Maintenant, nous obtenons:

is_integer(fl)   # True

isclose livré avec Python 3.5 + , et pour D'autres Python, vous pouvez utiliser cette définition principalement équivalente (comme mentionné dans le Pep correspondant)

2
répondu control_fd 2016-06-10 17:24:00

Vous pouvez utiliser le round fonction pour calculer la valeur.

Oui en python comme beaucoup l'ont fait quand on calculer la valeur d'une racine cubique, il vous donnera une sortie avec un peu d'erreur. Pour vérifier si la valeur est un nombre entier, vous pouvez utiliser la fonction suivante:

def cube_integer(n):
    if round(n**(1.0/3.0))**3 == n:
        return True
    return False

, Mais rappelez-vous que int(n) est équivalent à math.floor et de ce fait, si vous trouvez le int(41063625**(1.0/3.0)), vous obtiendrez 344 au lieu de 345.

Alors soyez prudent lors de l'utilisation int dont les racines cubiques.

J'espère avoir répondu à votre question. Si vous avez d'autres questions, alors vous pouvez me contacter.

0
répondu Anivarth 2016-10-17 09:24:53

Juste une info latérale, is_integer fait en interne:

import math
isInteger = (math.floor(x) == x)

Pas exactement en python, mais l'implémentation de cpython est implémentée comme mentionné ci-dessus.

0
répondu user1767754 2018-01-22 08:04:21

Essayez d'utiliser:

int(val) == val

Cela donnera beaucoup plus de précision que toutes les autres méthodes.

-1
répondu Nishant Ingle 2018-07-25 10:00:39