2017-10-03 8 views
-2

このコードは1.5(値= 15)を2に丸めますが、144.5(値= 1445)を144に丸めます。理由はわかりません。Python丸め混同

def rounders(value): 
    count = 0 
    while value >= 10: 
     value = round(value/10, 0) 
     count += 1 
    return value * (10 ** count) 

これは私の試みである "ラウンドアラー"に挑戦しています。以下は、試みられていることの説明です。値について

= 15、出力 ラウンダーズ(値)= 20であるべきです。 > 1200 - - > 1230 -

値= 1234、出力 ラウンダーズ(値)= 1000

1234であるべき値= 1445の場合> 1000

、出力は なければなりませんラウンダーズ(値)=

1445 2000 - > 1450 - > 1500 - > 2000

+0

このpythonの2または3ですか? – sberry

答えて

1

この質問はStrange behavior of numpy.roundと非常によく似ています。 np.roundに書かれているものは、roundのPython 3メソッドに直接適用できます。Python 2の動作は異なります(上の記事で説明したとおりです)。

round方法のdocumentationを見て:

2つの倍数が等しく近い場合、丸めはでも選択肢に向かって行われます。あなたはif文シンプルで直感的な行動を丸め方法を書くことができ、

round(2.5) == 2 
round(3.5) == 4 

ある

def myRound(x): 
    r = x % 1 
    if r < 0.5: 
     return x-r 
    else: 
     return x-r+1 
+2

サイドノート:この丸めモードは、「ラウンドハーフイーブン」モードと呼ばれることが多く、財務的な状況での公平な丸め(銀行が常に好意的に四捨五入しないようにする)やカスケードエラーを避けるために便利です(長い計算で同じ方向に繰り返して丸めればエラーが拡大し、さらに丸めれば均衡が取れなくなる傾向があります)。より多くのコントロールが必要な場合は、 'decimal.Decimal'の値を使用して、あなたの[好ましい丸めモード](https://docs.python.org/3/library/decimal)を選択*する*ためにコンテキストを微調整することができます。 html#rounding-modes)を使用して目的の動作に合わせます。 – ShadowRanger

+2

また、 'round'はPy3上でのみround-half-evenモードを使います。 [Py2では、 'round'モードはラウンドハーフアップです](https://docs.python.org/2/library/functions.html#round)(半分は0から丸められているので、' -0.5' '-1.0'と' 0.5' - > '1.0')、常に' float'(2番目の引数が与えられていないときにPy3がintを返します)を返します。 – ShadowRanger