web-dev-qa-db-ja.com

Python 10の次に高いパワーに丸める

どうやってmath.ceil次の10のべき乗に番号が割り当てられるように?

# 0.04  ->  0.1
# 0.7   ->  1
# 1.1   ->  10  
# 90    ->  100  
# ...

私の現在の解決策は入力数の範囲をチェックする辞書ですが、それはハードコードされており、1行の解決策を好みます。多分私はここで単純な数学のトリックまたは対応する派手な関数を欠いていますか?

46
offeltoffel

これをチェック!

_>>> 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
_

このコードは、len(str(int(float_number)))の10のべき乗の原理に基づいています。

4つのケースがあります。

    1. int(i) > 1

      Float数値-intに変換され、その後、それから文字列str()stringlengthに変換します。正確に見ています。したがって、最初の部分は、入力_i > 1.0_の場合、この長さの10の_10_です。

    1. &3.少し分岐:_i > 1.0_および_i > 0.1_ <=>それぞれ_10_および_1_です。
    1. そして最後の場合、_i < 0.1_の場合:ここで、10は負のべき乗になります。コンマの後に最初のゼロ以外の要素を取得するために、このような構造_("%.100f" % i).replace('.', '').index(k)_を使用しました。ここで、kは_[1:10]_間隔にわたって実行されます。その後、結果リストを最小限にしてください。そして、1ずつ減少します。これは最初のゼロであり、カウントされます。また、ここで標準のpythonのindex()は、_[1:10]_間隔からゼロ以外の要素が1つも見つからない場合、クラッシュする可能性があります。そのため、結局、発生によってリストを「フィルター」する必要があります: if str(j) in "%.100f" % i。さらに、より正確に取得するために、_%.100f_は異なる場合があります。
0

私は最も簡単な方法だと思います:

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

これがお役に立てば幸いです。

0
Vacendak
y = math.ceil(x)
z = y + (10 - (y % 10))

このような何か?それは私の頭の上にありますが、ターミナルでいくつかの数字を試したときにうまくいきました。

0
Lugene