3

小数点以下の桁数の精度が必要なため、Decimalクラスを使用するコードに依存しています。一部の関数では、コードベースの他の部分とのインターフェイス方法により、入力を浮動小数点にすることができます。それらを10進オブジェクトに変換するには、次のようなものを使用します。

mydec = decimal.Decimal(str(x))

ここで、xは入力として使用されるフロートです。私の質問は、floatに適用される「str」メソッドの標準が何であるかを誰かが知っていますか?

たとえば、番号2.1234512を考えてみましょう。フロートの表現方法のため、内部では2.12345119999999999として格納されます。

>>> x = 2.12345119999999999
>>> x
2.1234511999999999
>>> str(x)
'2.1234512'

この場合、str(x)は'%.6f'%xのようなことをしています。これは、私のコードが小数に変換される方法の問題です。次のようにします。

>>> d = decimal.Decimal('2.12345119999999999')
>>> ds = decimal.Decimal(str(2.12345119999999999))
>>> d - ds
Decimal('-1E-17')

したがって、float 2.12345119999999999があり、それをDecimalに渡したい場合、str()を使用して文字列に変換すると、間違った答えが返されます。このエラーを回避するためにこのコードを書き直す必要があるかどうかを判断する必要があるため、フォーマットを決定するstr(x)のルールを知る必要があります(たとえば、decimalオブジェクトがあると、コードは小数点以下10桁に丸められる場合があります)

うまくいけば、ここの誰かが私を指し示すことができるように、Pythonのドキュメントにいくつかのルールのセットが必要です。ありがとう!

4

2 に答える 2

4

Pythonソースで、「Include/floatobject.h」を調べます。文字列変換の精度は、コメントの後に上から数行に設定され、選択の説明が含まれています。

/* The str() precision PyFloat_STR_PRECISION is chosen so that in most cases,
   the rounding noise created by various operations is suppressed, while
   giving plenty of precision for practical use. */

#define PyFloat_STR_PRECISION 12

別のものが必要な場合は、再構築するオプションがあります。変更を加えると、浮動小数点数と複素数のフォーマットが変更されます。./Objects/complexobject.cおよび./Objects/floatobject.cを参照してください。また、これら2つのファイルでreprとstrがdoubleを変換する方法の違いを比較できます。

于 2013-02-25T19:02:20.380 に答える
3

ここで説明する価値のある問題がいくつかありますが、要約すると、システムにまだ保存されていない情報を抽出することはできません

10進数を浮動小数点として格納すると、情報が失われます。これは、桁数が有限のほとんどの10進数(基数10)は、基数2(基数10)の有限桁数を使用して格納できないためです。バイナリ)。

述べたように、str(a_float)実際に呼び出しますa_float.__str__()ドキュメントに記載されているように、そのメソッドの目的は次のとおりです。

オブジェクトの適切に印刷可能な表現を含む文字列を返します

ケースの特別な定義はありませんfloat。私の意見では、公式のドキュメントがないため、あなたの目的のために、__str__の動作は未定義であると見なす必要があります。現在の実装はいつでも変更される可能性があります。

元の文字列がない場合、floatオブジェクトから10進表現の欠落している数字を抽出する方法はありません。あなたができることは、文字列フォーマット(あなたが言及している)を使用して、予想通りに丸めることです:

Decimal( "{0:.5f}".format(a_float) )

右側の0を削除することもできますresulting_string.rstrip("0")。この場合も、この方法では失われた情報は回復されません。

于 2013-02-25T19:08:05.997 に答える