Comment pourrais-je réussir à exécuter math.ceil
de telle sorte qu'un nombre soit attribué à la prochaine puissance la plus élevée de 10?
# 0.04 -> 0.1
# 0.7 -> 1
# 1.1 -> 10
# 90 -> 100
# ...
Ma solution actuelle est un dictionnaire qui vérifie la plage du nombre d'entrée, mais il est codé en dur et je préférerais une solution à une seule ligne. Peut-être que je manque une astuce mathématique simple ou une fonction numpy correspondante ici?
Regarde ça!
>>> i = 0.04123
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))
0.04123 0.1
>>> i = 0.712
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))
0.712 1
>>> i = 1.1
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))
1.1 10
>>> i = 90
>>> print i, 10 ** len(str(int(i))) if int(i) > 1 else 10 if i > 1.0 else 1 if i > 0.1 else 10 ** (1 - min([("%.100f" % i).replace('.', '').index(k) for k in [str(j) for j in xrange(1, 10) if str(j) in "%.100f" % i]]))
90 100
Ce code est basé sur le principe de la puissance de dix dans len(str(int(float_number)))
.
Il y a 4 cas:
int(i) > 1
.
Float
nombre - converti en int
, ensuite la chaîne str()
de celui-ci, nous donnera un string
avec length
ce que nous sommes regardant exactement. Donc, première partie, pour l'entrée i > 1.0
- il y a dix 10
En puissance de cette longueur.
i > 1.0
Et i > 0.1
<=> c'est 10
Et 1
Respectivement.i < 0.1
: Ici, dix seront en puissance négative. Pour obtenir le premier élément non nul après la virgule, j'ai utilisé une telle construction ("%.100f" % i).replace('.', '').index(k)
, Où k court sur l'intervalle [1:10]
. Par la suite, prenez le minimum de liste de résultats. Et diminuez de un, c'est le premier zéro qui doit être compté. De plus, ici la index()
de python standard peut planter, s'il ne trouve pas au moins un élément non nul de l'intervalle [1:10]
, C'est pourquoi à la fin je dois "filtrer" la liste par occurrence: if str(j) in "%.100f" % i
. De plus, pour être plus précis - %.100f
Peut être pris différemment.Je pense que le moyen le plus simple est:
import math
number = int(input('Enter a number: '))
next_pow_ten = round(10 ** math.ceil(math.log10(number)))
print(str(10) + ' power ' + str(round(math.log10(number))) + ' = '\
+ str(next_pow_ten))
J'espère que cela vous aidera.
y = math.ceil(x)
z = y + (10 - (y % 10))
Quelque chose comme ça peut-être? C'est juste par dessus ma tête, mais cela a fonctionné lorsque j'ai essayé quelques numéros dans le terminal.