web-dev-qa-db-ja.com

Pythonで5(または他の数)に丸めます

次のように丸めることができる組み込み関数はありますか?

10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
144
Pydev UA

私はPythonの標準関数を知りませんが、これは私には有効です:

Python 2

def myround(x, base=5):
    return int(base * round(float(x)/base))

Python3

def myround(x, base=5):
    return base * round(x/base)

上記が機能する理由は簡単にわかります。 5で割った数値が整数で、正しく丸められていることを確認する必要があります。したがって、最初にそれを正確に行い(round(float(x)/5) where floatはPython2でのみ必要です)、次に5で割ったので、5を掛けます。 intへの最後の変換は、round()がPython 2の浮動小数点値を返すためです。

baseパラメーターを指定することで、関数をより汎用的にしました。デフォルトは5です。

261
Alok Singhal

0.05などの非整数値に丸める場合:

def myround(x, prec=2, base=.05):
  return round(base * round(float(x)/base),prec)

パラメータ値を変更することなく、「round(」を「myround(」に変更するためにコード内で検索と置換を行うことができるため、これは便利です。

41
CCKx

それは単にスケーリングの問題です

>>> a=[10,11,12,13,14,15,16,17,18,19,20]
>>> for b in a:
...     int(round(b/5.0)*5.0)
... 
10
10
10
15
15
15
15
15
20
20
20
19
amo-ej1

「残り」を削除すると動作します:

rounded = int(val) - int(val) % 5

値が整数である場合:

rounded = val - val % 5

機能として:

def roundint(value, base=5):
    return int(value) - int(value) % int(base)
12
hgdeoro
def round_to_next5(n):
    return n + (5 - n) % 5
8
Andy Wong

round(x [、n]):値は、10のべき乗からnを引いた最も近い倍数に丸められます。したがって、nが負の場合...

def round5(x):
    return int(round(x*2, -1)) / 2

10 = 5 * 2なので、5.0での浮動小数点除算および乗算ではなく、2での整数除算および乗算を使用できます。あなたがビットシフトを好まない限り、それはそれほど重要ではありません

def round5(x):
    return int(round(x << 1, -1)) >> 1
6
pwdyson

申し訳ありませんが、Alok Singhaiの回答にコメントしたかったのですが、評判が悪いために私を許可しません= /

とにかく、もう1つのステップを一般化して実行できます。

def myround(x, base=5):
    return base * round(float(x) / base)

これにより、.25やその他の小数ベースなどの非整数ベースを使用できます。

4
ArturJ

Divroundの修正バージョン:-)

def divround(value, step, barrage):
    result, rest = divmod(value, step)
    return result*step if rest < barrage else (result+1)*step

つかいます:

>>> from __future__ import division   # This is only needed on Python 2
>>> def round_to_nearest(n, m):
        r = n % m
        return n + m - r if r + r >= m else n - r

...

乗算を使用せず、フロートから/への変換を行いません。

最も近い10の倍数への丸め:

>>> for n in range(-21, 30, 3): print('{:3d}  =>  {:3d}'.format(n, round_to_nearest(n, 10)))
-21  =>  -20
-18  =>  -20
-15  =>  -10
-12  =>  -10
 -9  =>  -10
 -6  =>  -10
 -3  =>    0
  0  =>    0
  3  =>    0
  6  =>   10
  9  =>   10
 12  =>   10
 15  =>   20
 18  =>   20
 21  =>   20
 24  =>   20
 27  =>   30

ご覧のとおり、負数と正数の両方で機能します。ネクタイ(例:-15と15)は常に上向きに丸められます。

5の最も近い倍数に丸める同様の例は、異なる「ベース」でも期待どおりに動作することを示しています。

>>> for n in range(-21, 30, 3): print('{:3d}  =>  {:3d}'.format(n, round_to_nearest(n, 5)))
-21  =>  -20
-18  =>  -20
-15  =>  -15
-12  =>  -10
 -9  =>  -10
 -6  =>   -5
 -3  =>   -5
  0  =>    0
  3  =>    5
  6  =>    5
  9  =>   10
 12  =>   10
 15  =>   15
 18  =>   20
 21  =>   20
 24  =>   25
 27  =>   25
2

誰かが「財務上の丸め」を必要とする場合(常に0.5切り上げ):

def myround(x, base=5):
    roundcontext = decimal.Context(rounding=decimal.ROUND_HALF_UP)
    decimal.setcontext(roundcontext)
    return int(base *float(decimal.Decimal(x/base).quantize(decimal.Decimal('0'))))

ドキュメントによると、他の丸めオプションは次のとおりです。

ROUND_CEILING(無限に向かって)、
ROUND_DOWN(ゼロに向かって)、
ROUND_FLOOR(-Infinityに向かって)、
ROUND_HALF_DOWN(最も近いタイへゼロに向かって)、
ROUND_HALF_EVEN(最も近い偶数に最も近い偶数に向かうタイと)
ROUND_HALF_UP(タイからゼロに近づいて最も近いもの)、または
ROUND_UP(ゼロから離れる)。
ROUND_05UP(ゼロに丸めた後の最後の桁が0または5であった場合はゼロから離れ、それ以外の場合はゼロに向かって)

デフォルトでは、PythonはROUND_HALF_EVENを使用します。これには統計的な利点があるためです(丸められた結果には偏りがありません)。

1
Piotr Siejda

5の次の倍数

51を55に変換する必要があるとします。

code here

mark = 51;
r = 100 - mark;
a = r%5;
new_mark = mark + a;
0
vijay

これが私のCコードです。私がそれを正しく理解していれば、このようなものであるはずです。

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        number++;
  printf("%d\n",number);
  }
}

また、これは単に切り上げるのではなく、最も近い5の倍数に切り上げます。

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        if (number%5 < 3)
            number--;
        else
        number++;
  printf("nearest multiple of 5 is: %d\n",number);
  }
}
0
Ege Merey

これはどうですか:

 def divround(value, step):
     return divmod(value, step)[0] * step