13

私のコード:

  #!/usr/bin/python
  # -*- coding: utf-8 -*-
  print (round(1.555, 1))  # It seems normal
  print (round(1.555, 2))  # Why it is not output 1.56?
  print (round(1.556, 2))  # It seems normal

出力:

  sam@sam:~/code/python$ ./t2.py
  1.6
  1.55
  1.56
  sam@sam:~/code/python$

round(1.555, 1)出力します1.6

なぜround(1.555, 2)出力しないの1.56ですか?

4

3 に答える 3

18

ドキュメントを見てください:

注forfloatの動作はround()驚くべきものになる可能性があります。たとえば、expectedの代わりに round(2.675, 2)givesを使用します。これはバグではありません。ほとんどの小数部を浮動小数点数として正確に表すことができないという事実の結果です。詳細については、浮動小数点演算:問題と制限を参照してください。2.672.68

掘り続ける(つまり、そのリンクをクリックする)と、次のような例が見つかります。

組み込み関数のドキュメントには、round()ゼロからのタイを丸めて、最も近い値に丸めると記載されています。10分の12.675はとのちょうど中間に2.67ある2.68ため、ここでの結果は(のバイナリ近似)になると予想される場合があります 2.68。10進文字列2.675が2進浮動小数点数に変換されると、正確な値が2進近似値に再び置き換えられるため、そうではありません。

2.67499999999999982236431605997495353221893310546875

文字列のフォーマットも問題を解決しません。浮動小数点数は、期待どおりに保存されません。

>>> '{:0.2f}'.format(1.555)
'1.55'

これは実際には「修正」ではありませんが、Pythonにはdecimal浮動小数点演算用に設計されたモジュールがあります。

>>> from decimal import Decimal
>>> n = Decimal('1.555')
>>> round(n, 2)
Decimal('1.56')
于 2013-01-10T02:48:46.503 に答える
6

ドキュメントから直接:

float に対する round() の動作は驚くべきものです。たとえば、round(2.675, 2) は、予想される 2.68 ではなく 2.67 を返します。これはバグではありません。これは、ほとんどの小数が float として正確に表現できないという事実の結果です。詳細については、浮動小数点演算: 問題と制限を参照してください。

于 2013-01-10T02:38:34.783 に答える
0

http://docs.python.org/2/library/functions.html#roundから:

ノート

floatのround()の動作は驚くべきものになる可能性があります。たとえば、round(2.675、2)は、期待される2.68ではなく2.67を返します。これはバグではありません。ほとんどの小数部を浮動小数点数として正確に表すことができないという事実の結果です。詳細については、浮動小数点演算:問題と制限を参照してください。

于 2013-01-10T02:40:27.367 に答える