質問

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ディスカッションもご覧ください。 フラップのようなものを使用してフロートを合理化することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top