2

誰かが以下で何が起こっているのか説明してもらえますか:(私はPython3.3を使用しています)

1. >>> Decimal("0.1") + Decimal("0.1") + Decimal("0.1") - Decimal("0.3")
       Decimal('0.0')

2. >>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
       Decimal('2.775557561565156540423631668E-17')

3. >>> Decimal(0.1 + 0.1 + 0.1 - 0.3)
       Decimal('5.5511151231257827021181583404541015625E-17')

私はそれが浮動小数点の制限に関係していることを知っています、誰かが理由を説明できれば嬉しいです

  • " "上記の例1と2の違いとは何の関係がありますか
  • 両方にないのに、なぜ2は3とは異なる答えを生成するの" "ですか?
4

1 に答える 1

7

一言で言えば、どちら0.10.3正確に次のように表すことはできませんfloat

In [3]: '%.20f' % 0.1
Out[3]: '0.10000000000000000555'

In [4]: '%.20f' % 0.3
Out[4]: '0.29999999999999998890'

したがって、0.1または0.3を初期化するDecimal()場合、結果の値はおおよそ 0.1または0.3です。

文字列("0.1"または"0.3")を使用しても、この問題は発生しません。

最後に、2番目の例では、3番目の例とは異なる結果が生成されます。これは、どちらも暗黙的な丸めが含まれている場合でも、小数点以下の桁数が異なるためです。

于 2013-01-28T22:09:24.570 に答える