私はかなり環境に配慮したプログラマーであり、現在Pythonを学んでいます。私は「コンピュータ科学者のように考えることを学ぶ」(クラスとメソッド)の第17章までですが、完全には理解できない方法で失敗した最初のdoctestを書いたばかりです。
class Point(object):
'''
represents a point object.
attributes: x, y
'''
def ___init___(self, x = 0, y = 0):
'''
>>> point = Point()
>>> point.y
0
>>> point = Point(4.7, 8.2)
>>> point.x
4.7
'''
self.x = x
self.y = y
の2番目のdoctestは__init__
失敗し、4.7ではなく4.7000000000000002を返します。ただし、「print」ステートメントを使用してdoctestを次のように書き直すと、次のようになります。
>>> point = Point(4.7, 8.2)
>>> print point.x
4.7
正しく動作します。
そこで、Pythonがどのようにfloatを格納するかを読みました。そして、10進数のバイナリ表現のために、不一致の理由は、Pythonが4.7を1と0の文字列として格納するためです。 。
しかし、私が理解していないのは、「point.x」を呼び出すと4.7000000000000002が返され、「printpoint.x」を呼び出すと4.7が返される理由です。他にどのような状況で、Pythonは「印刷」の場合と同じように丸めることを選択しますか?この丸めはどのように機能しますか?これらの有効数字の末尾は、プログラミングのエラーにつながる可能性がありますか(明らかに、doctestの失敗は別として)?丸めに注意を払わないと、危険なあいまいさが生じる可能性がありますか?
これは10進数のバイナリ表現に関係しているので、これは実際には一般的なCSの問題であり、Pythonに固有の問題ではないと確信していますが、今私が本当に知っておく必要があるのは、具体的にはPythonプログラマー、関連する問題やバグの蔓延を回避します。
また、ボーナスポイントについては、「a = 4.7」のような行によってアクティブ化されるデフォルト以外に、Pythonが浮動小数点数を格納できる他の方法はありますか?Decimalパッケージがあることは知っていますが、それがどのように機能するかは完全にはわかりません。正直なところ、この動的型付けのすべてが私を混乱させることがあります。
編集: Python 2.6を使用していることを指定する必要があります(ある時点でNumPyとBiopythonを使用したい)