web-dev-qa-db-fra.com

Python arrondi à la puissance la plus élevée suivante de 10

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?

46
offeltoffel

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:

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

    1. & 3. Petit branchement: i > 1.0 Et i > 0.1 <=> c'est 10 Et 1 Respectivement.
    1. Et dernier cas, quand 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.
0

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.

0
Vacendak
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.

0
Lugene