4

私は Python にかなり慣れていないので、10 進数モジュールや浮動小数点 (例: " %4f" %n) を使用せずに、特定の数値の 10 進数の精度をどのように制御できるのか疑問に思っていました。

例 (編集):

入力(2/7)

0.28571428571....

入力(1/3)

0.3333333333333....

そして、私はそれらを小数点以下1000桁またはその点で任意の小数点にしたかったのです。while を制御ループとして使用することを考えていましたが、その方法がよくわかりません。ありがとう

編集: decimal モジュールを使用しない理由は、これらのタイプの背後にあるアルゴリズム/ロジックを概念化できるようにするためです。物事の背後にある論理を本当に理解しようとしているだけです。

4

3 に答える 3

7

a を使用しlongて、10 進数を高精度で格納し、演算を行うことができます。印刷する方法は次のとおりです。

def print_decimal(val, prec):
    intp, fracp = divmod(val, 10**prec)
    print str(intp) + '.' + str(fracp).zfill(prec)

使用法:

>>> prec = 1000
>>> a = 2 * 10**prec
>>> b = a//7
>>> print_decimal(b, prec)
0.2857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857
于 2012-10-23T19:37:54.163 に答える
5

Python 3 を想定して、Decimal モジュールを使用しない場合 (なぜですか?):

def divide(num, den, prec):
    a = (num*10**prec) // den
    s = str(a).zfill(prec+1)
    return s[0:-prec] + "." + s[-prec:]

賢いアイデアをくれた@nneonneoに感謝します.zfill()

>>> divide(2,7,1000)
'0.28571428571428571428571428571428571428571428571428571428571428571428571428571
42857142857142857142857142857142857142857142857142857142857142857142857142857142
85714285714285714285714285714285714285714285714285714285714285714285714285714285
71428571428571428571428571428571428571428571428571428571428571428571428571428571
42857142857142857142857142857142857142857142857142857142857142857142857142857142
85714285714285714285714285714285714285714285714285714285714285714285714285714285
71428571428571428571428571428571428571428571428571428571428571428571428571428571
42857142857142857142857142857142857142857142857142857142857142857142857142857142
85714285714285714285714285714285714285714285714285714285714285714285714285714285
71428571428571428571428571428571428571428571428571428571428571428571428571428571
42857142857142857142857142857142857142857142857142857142857142857142857142857142
85714285714285714285714285714285714285714285714285714285714285714285714285714285
7142857142857142857142857142857142857142857'

警告: これはフロア分割を使用divide(2,3,2)するため、0.66代わりに が表示され0.67ます。

于 2012-10-23T19:18:02.410 に答える