行ごとの内訳は次のとおりです。
def intF(n, d, l=40):
かなり明白。n
は数値、d
は別の数値(除数)、l
は小数点以下に出力する桁数です。
s=str(n*10**l / d)
これは少し変わったことをします。浮動小数点演算に依存するのではなく、これは、、つまり数字が後に続くことで乗算n
されます。そうすれば、最終結果に浮動小数点エラーが発生することはありません。常に整数であると仮定します。(ただし、もちろん残りの数字は切り捨てられます。また、同じ動作を得るには、Python 3でに置き換えてください。)10 ** l
1
l
d
/
//
この時点で、は整数の文字列表現になります(これも整数であるとs
仮定します)が、の結果と同じ桁になります。だから今、私たちは正しい場所に小数点を挿入する必要があります。d
float(n) / d
if len(s) < l:
return '0.{:0>{width}}'.format(s,width=l)
の長さs
が。未満の場合はl
、それを埋めて、の前にを付ける必要があり0.
ます。それがこれが行うことです。この{:0>{width}}
フィールドは、幅がゼロで埋められたフィールドを作成し、右側( )側width
に値を挿入することを示しています。>
次にs
、を介して渡されformat
、結果が得られます。
if len(s) > l:
return s[0:len(s)-l]+'.'+s[len(s)-l:]
の長さが、a
より大きい場合l
は、正しい場所に小数点を挿入する必要があります。それがこれが行うことです。l
から末尾の数字を削除しs
、を追加してから.
、残りのl
数字を追加します。
return '0.'+s
最後の可能性は、s
正確にl
数字の長さであるということです。その場合、パディングを行う必要はありません。0
と小数点を追加するだけです。
最後に、この関数に整数以外のものを渡すと、期待どおりに機能しません。このことを考慮:
>>> intF(10, 10.1, 10)
'990.0990099.01'
またはこれ:
>>> intF(10.1, 10, 10)
'101.00000000.0'