Python Decimalは、floatからの構築をサポートしていません。最初にfloatを文字列に変換する必要があると想定しています。
Floatの標準の文字列フォーマッタでは、有効桁数ではなく小数点以下の桁数を指定する必要があるため、これは非常に不便です。したがって、小数点以下15桁までの数字がある場合、Decimal( ""%。15f "%my_float)としてフォーマットする必要があります。小数。
ユーザーが入力したときに、フロートから10進数の保存値に変換するための良い方法を誰かが提案できますか?
"%.15g" % f
またはPython 3.0:
format(f, ".15g")
次のように、フロートを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は、floatからのDecimal作成をサポートします。最初に文字列としてキャストするだけです。ただし、文字列変換では精度の低下は発生しません。変換するフロートは、そもそもそのような精度を持ちません。 (それ以外の場合、Decimalは必要ありません)
ここでの混乱は10進形式で浮動小数点リテラルを作成できるであると思いますが、インタープリターがそのリテラルを消費するとすぐに、内部表現は浮動小数点数になります。
Floatの「公式」文字列表現は、組み込みのrepr()によって提供されます。
>>> repr(1.5)
'1.5'
>>> repr(12345.678901234567890123456789)
'12345.678901234567'
フォーマットされた文字列の代わりにrepr()を使用できます。結果には不要なゴミが含まれません。
「ユーザーが入力した値を保持する」と言う場合、ユーザーが入力した値を文字列として保存し、それをDecimalコンストラクターに渡すだけではどうでしょうか。
これを行う「正しい」方法は、1990年に Steele and White's and Clinger's PLDI 199 の論文で文書化されました。