0

役立つ場合はVerison 2.6.5。だから、私はdjangoでいくつかのことをして、Floatfieldから値を取得しています。そして、それを別の floatfield と比較します。これら 2 つの X と Y を呼びましょう。実行すると、X は最終的に 35.0 になります。Y を実行すると、最終的に 35.0 になります。

35.0 > 35.0 # False, ok no worries
X > Y # True, why?
round(X) > round(Y) # False, ok looks like i have to round it

計算中にフロートに問題があることは知っていますが、この場合、2 つの変数の値が 35.0 と表示されたので、実際には 35.0 であると思いました。これは、Python が float オブジェクトの背後にある情報を表示しない可能性があることを意味しますか? これはよくある質問だと思いますが、実際に 35.000000001 か何かだった場合、python はその値全体を表示しませんか?

編集:OK、最後にこれを読んでください。浮動小数点の生活の問題が解決しました笑。http://docs.python.org/2/tutorial/floatingpoint.html

4

2 に答える 2

2

Python は、浮動小数点値を印刷/表現するときに丸めることがありますが、比較するときはそうしません。

これを試して:

'{:.17f} {:.17f}'.format(X, Y)

(float の有効桁数は 17 桁強であり、数値は の範囲内[10, 100)にあるため、存在するすべての詳細を表示するには 17 桁を表示するだけで十分です。ただし、計算方法がわからない場合は、放っておいてください。いくつかの余分な数字:{:.64f}完全に合法です。)

Decimalまたは、それらを十分に高い精度でオブジェクトに変換して、違いを表現したり、他の多くのものを表現したりすることもできます。

または、最も簡単に言えば、が より大きいX > Yかどうかを調べる良いテストです。実際に知りたいのは だけです。XY


実際のコードでは、2 つの異なる計算から得られた 2 つの float 値が「同じ」かどうかを知りたい場合、それはできません。理想的には、適切なエラー分析を行う必要があります。それができない場合は、イプシロン計算 (abs(X-Y) < EPSILON固定スケールを気にする場合、またはabs((X-Y) / (X+Y)) < EPSILONスケールが何であるかわからない場合など) で十分なことがよくあります。しかし、決して十分X == Yではありません。


※詳細は Python のバージョンにより異なります。たとえば、これを試してください:

>>> str(1.000000000000001), repr(1.000000000000001)

Python 2.7 では、次のようになります。

'1.0', '1.000000000000001'

しかし、Python 3.3 では:

'1.000000000000001', '1.000000000000001'
于 2013-05-15T01:15:13.320 に答える