質問
Python Decimalは、floatからの構築をサポートしていません。最初にfloatを文字列に変換する必要があると想定しています。
floatの標準の文字列フォーマッタでは、重要な位置ではなく小数点以下の桁数を指定する必要があるため、これは非常に不便です。したがって、小数点以下15桁までの数字がある場合は、Decimal(<!> quot; <!> quot;%。15f <!> quot;%my_float)としてフォーマットする必要があります。小数点の前に有効数字もある場合は、小数点第15位。
サポートされている有効桁数を制限するなど、ユーザーが入力した値を浮動小数点から10進数に変換する良い方法を誰かが提案できますか?
解決
Python <!> lt; 2.7
"%.15g" % f
またはPython 3.0の場合:
format(f, ".15g")
Python 2.7 +、3.2 +
このように、フロートをDecimal
コンストラクターに直接渡すだけです:
from decimal import Decimal
Decimal(f)
他のヒント
質問で次のように言いました:
誰かが良い方法を提案できますか floatからdecimalへの変換 ユーザーが持っているように価値を維持する 入力
ただし、ユーザーが値を入力するたびに、フロートとしてではなく文字列として入力されます。どこかにフロートに変換しています。代わりに、10進数に直接変換すると、精度が失われません。
これを提案する
>>> a = 2.111111
>>> a
2.1111110000000002
>>> str(a)
'2.111111'
>>> decimal.Decimal(str(a))
Decimal('2.111111')
Pythonは、フロートからの10進数の作成をサポートします。最初に文字列としてキャストするだけです。ただし、文字列変換では精度の低下は発生しません。変換するフロートは、そもそもそのような精度を持ちません。 (それ以外の場合、10進数は必要ありません)
ここでの混乱は、 10進形式でfloatリテラルを作成できると思いますが、インタープリターがそのリテラルを消費するとすぐに、内部表現が浮動小数点数になります。
<!> quot; official <!> quot; floatの文字列表現は、組み込みのrepr()によって提供されます。
>>> repr(1.5)
'1.5'
>>> repr(12345.678901234567890123456789)
'12345.678901234567'
フォーマットされた文字列の代わりにrepr()を使用できます。結果には不要なゴミが含まれません。
<!> quot;ユーザーが入力した値を保持する<!> quot;と言うとき、ユーザーが入力した値を文字列として保存し、それをDecimalコンストラクターに渡すだけではどうですか?
<!> quot; right <!> quot;これを行う方法は、1990年に Steele and White'sおよび ClingerのPLDI 1990 論文。
こちら Python Decimalに関するSOディスカッションもご覧ください。 フラップのようなものを使用してフロートを合理化することをお勧めします。