次のように丸めることができる組み込み関数はありますか?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
私はPythonの標準関数を知りませんが、これは私には有効です:
def myround(x, base=5):
return int(base * round(float(x)/base))
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です。
0.05などの非整数値に丸める場合:
def myround(x, prec=2, base=.05):
return round(base * round(float(x)/base),prec)
パラメータ値を変更することなく、「round(」を「myround(」に変更するためにコード内で検索と置換を行うことができるため、これは便利です。
それは単にスケーリングの問題です
>>> 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
「残り」を削除すると動作します:
rounded = int(val) - int(val) % 5
値が整数である場合:
rounded = val - val % 5
機能として:
def roundint(value, base=5):
return int(value) - int(value) % int(base)
def round_to_next5(n):
return n + (5 - n) % 5
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
申し訳ありませんが、Alok Singhaiの回答にコメントしたかったのですが、評判が悪いために私を許可しません= /
とにかく、もう1つのステップを一般化して実行できます。
def myround(x, base=5):
return base * round(float(x) / base)
これにより、.25
やその他の小数ベースなどの非整数ベースを使用できます。
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
誰かが「財務上の丸め」を必要とする場合(常に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を使用します。これには統計的な利点があるためです(丸められた結果には偏りがありません)。
5の次の倍数
51を55に変換する必要があるとします。
code here
mark = 51;
r = 100 - mark;
a = r%5;
new_mark = mark + a;
これが私の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);
}
}
これはどうですか:
def divround(value, step):
return divmod(value, step)[0] * step