web-dev-qa-db-ja.com

Python float to Decimal conversion

Python Decimalは、floatからの構築をサポートしていません。最初にfloatを文字列に変換する必要があると想定しています。

Floatの標準の文字列フォーマッタでは、有効桁数ではなく小数点以下の桁数を指定する必要があるため、これは非常に不便です。したがって、小数点以下15桁までの数字がある場合、Decimal( ""%。15f "%my_float)としてフォーマットする必要があります。小数。

ユーザーが入力したときに、フロートから10進数の保存値に変換するための良い方法を誰かが提案できますか?

49
Kozyarchuk

Python <2.7

"%.15g" % f

またはPython 3.0:

format(f, ".15g")

Python 2.7 +、3.2 +

次のように、フロートをDecimalコンストラクターに直接渡します。

from decimal import Decimal
Decimal(f)
52
jfs

あなたはあなたの質問で言った:

誰かがfloatからdecimalに変換する良い方法を提案できますか?ユーザーが入力した値を保持

ただし、ユーザーが値を入力するたびに、フロートとしてではなく文字列として入力されます。どこかにフロートに変換しています。代わりに、10進数に直接変換してください。精度は失われません。

23
nosklo

これをお勧めします

>>> a = 2.111111
>>> a
2.1111110000000002
>>> str(a)
'2.111111'
>>> decimal.Decimal(str(a))
Decimal('2.111111')
12
vincent wen

Pythonは、floatからのDecimal作成をサポートします。最初に文字列としてキャストするだけです。ただし、文字列変換では精度の低下は発生しません。変換するフロートは、そもそもそのような精度を持ちません。 (それ以外の場合、Decimalは必要ありません)

ここでの混乱は10進形式で浮動小数点リテラルを作成できるであると思いますが、インタープリターがそのリテラルを消費するとすぐに、内部表現は浮動小数点数になります。

4
muhuk

Floatの「公式」文字列表現は、組み込みのrepr()によって提供されます。

>>> repr(1.5)
'1.5'
>>> repr(12345.678901234567890123456789)
'12345.678901234567'

フォーマットされた文字列の代わりにrepr()を使用できます。結果には不要なゴミが含まれません。

3

「ユーザーが入力した値を保持する」と言う場合、ユーザーが入力した値を文字列として保存し、それをDecimalコンストラクターに渡すだけではどうでしょうか。

2
Paul Fisher

これを行う「正しい」方法は、1990年に Steele and White's and Clinger's PLDI 199 の論文で文書化されました。

this SOについての議論Python 10進数、 frap フロートを合理化します。

0
Doug Currie