なぜstrはPython 3でPython 2よりも多くの数字を返しますか?


Python 2.7で、floatのreprは一番十進数に近い十進数を返します。これは、各可能なIEEE浮動小数点の値を正確に識別するのに十分です。浮動小数点のstrは同様に動作します。結果を12桁に制限する以外は、大多数の目的に対して、これはより合理的な結果であり、バイナリと十進数の表現の間の僅かな違いから免除されます。
Python 2デモンストレーション:http://ideone.com/OKJtxv

print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
Python 3.2では、strとreprは同じことを返します。
Python 3デモンストレーション:http://ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
変更を説明するPEPまたは誰かが担当する他の声明がありますか?
いいえ、PEPがありません。エラートラッカの中にissueがあります。Python開発者メールリストの中にassited discussionがあります。
私は変革の提案と実施を担当していますが、これは私の考えとは言えません。EuroPython 2010とGidoの対話によって生まれたものです。
いくつかの詳細:コメントで既に述べたように、Python 3.1はfloatのstring reprに新しいアルゴリズムを導入しました。(その後、Python 2シリーズに転載されました。Python 2.7にも現れました。)この新しいアルゴリズムの結果として、提示符の下に入力された「短い」10進数は対応する短い表現を持っています。これはstrとの違いを解消しました。そして、strとreprに対して同じアルゴリズムを使用することができます。だからPython 3.2については、上記の議論に従って、strとreprは同じです。なぜ、言語をより小さくして清潔にし、文字列を出力すると、12桁の数字のかなり自由な選択が削除されます。ちなみに、2つの異なるIEEE 754 binary 64浮動小数点は、10進数に変換する際に異なる表現を持ち、17桁の有効数字、17は最小の整数とこの属性です。)
簡単に加えて、いくつかの明確ではない利点があります。過去にユーザーを混乱させたreprはstrに対して区別される一方、reprは自動的に容器に使用されます。だから、例えばPython 2.7において:

>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]
少なくとも一つのStockOverflow問題があることを確認します。この現象について聞きます。here is one suchanotherはもっと近いです。Python 3.2で導入された簡略化によって、私達は得られます。

>>> x = 1.4 * 1.5
>>> print(x)
2.0999999999999996
>>> print([x])
[2.0999999999999996]
これは少なくとももっと一致しています。
正確ではないことを隠したい場合は、正しい方法はそのままにしてください。文字列書式を使って出力フォーマットを正確に制御します。

>>> print("{:.12g}".format(x))
2.1
この変化の背景にある原因を説明したいです。これは普遍的に有益なものだとは思いません。ご指摘の通り、古いstrは不正確な副作用を秘めています。しかし、私から見れば(もちろん偏見があります。)、言葉の中の驚きを解消するのに役立ちます。
締め括りをつける
以上述べたのは小编で绍介したなぜstrはPython 3の中でPython 2よりも多くの数字を返しますか?皆さんの助けになりたいです。ここでも私たちのサイトを応援してくれてありがとうございます。