72

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

float の標準的な文字列フォーマッタでは、有効桁数ではなく小数点以下の桁数を指定する必要があるため、これは非常に不便です。したがって、小数点以下 15 桁までの数値がある場合は、 のようにフォーマットする必要がありますDecimal("%.15f" % my_float)。これにより、10 進数の前に有効桁数がある場合、小数点以下 15 桁にゴミが表示されます ( Decimal("%.15f" % 100000.3) == Decimal('100000.300000000002910'))。

float から Decimal に変換して、ユーザーが入力した値を維持する良い方法を誰かが提案できますか? サポートできる有効桁数を制限する可能性がありますか?

4

11 に答える 11

68

Python <2.7

"%.15g" % f

または Python 3.0 では:

format(f, ".15g")

Python 2.7+、3.2+

次のように、float をDecimalコンストラクターに直接渡すだけです。

from decimal import Decimal
Decimal(f)
于 2008-11-25T03:07:03.747 に答える
29

あなたはあなたの質問で言いました:

ユーザーが入力したときにfloatからDecimalpreservingvalueに変換する良い方法を誰かが提案できますか

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

于 2008-11-25T03:40:02.620 に答える
26

私はこれを提案します

>>> a = 2.111111
>>> a
2.1111110000000002
>>> str(a)
'2.111111'
>>> decimal.Decimal(str(a))
Decimal('2.111111')
于 2011-12-07T10:22:10.207 に答える
5

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

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

于 2008-12-04T22:41:36.170 に答える
4

float の「公式な」文字列表現は、組み込みの repr() によって与えられます。

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

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

于 2008-11-25T03:00:30.873 に答える
2

「ユーザーが入力した値を保持する」と言うときは、ユーザーが入力した値を文字列として格納し、それをDecimalコンストラクターに渡してみませんか?

于 2008-11-25T03:44:20.647 に答える
2

主な答えは少し誤解を招くものです。このg形式では、小数点以下の先行ゼロが無視されるため、format(0.012345, ".2g")0.012 - 小数点以下 3 桁が返されます。小数点以下の桁数に厳密な制限が必要な場合は、fフォーマッターを使用します。format(0.012345, ".2f") == 0.01

于 2020-05-27T14:55:08.017 に答える
1

これを行うための「正しい」方法は、1990年にSteeleandWhiteとClingerのPLDI1990の論文によって文書化されました。

また、 frapのようなものを使用してfloatを合理化することを試みるという私の提案を含め、PythonDecimalに関するこのSOの議論を見るかもしれません。

于 2008-11-25T03:41:27.237 に答える