回答:
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)
場所はfloat
、私たちは5を掛け、その後、私たちは5で割っただけなのでPython2に必要とされている)にも。への最後の変換int
はround()
、Python 2で浮動小数点値を返すためです。
base
デフォルトで5にパラメーターを指定して、関数をより汎用的にしました。
floor()
とceil()
キャストのではなく、:base * floor(x/base)
math.floor
およびmath.ceil
カスタムベースでの使用を許可しないため、設定は関係ありません。
0.05などの非整数値に丸める場合:
def myround(x, prec=2, base=.05):
return round(base * round(float(x)/base),prec)
パラメータ値を変更せずに、コード内で検索と置換を行うだけで "round("を "myround(")に変更できるため、これが便利であることがわかりました。
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
numpy配列も受け入れます。
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
使用する:
>>> 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を使用します(丸められた結果にはバイアスがかかりません)。
整数およびPython 3の場合:
def divround_down(value, step):
return value//step*step
def divround_up(value, step):
return (value+step-1)//step*step
生産:
>>> [divround_down(x,5) for x in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [divround_up(x,5) for x in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]
これはどうですか:
def divround(value, step):
return divmod(value, step)[0] * step
これが私の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 rnd(x, b=5):
return round(x + min(-(x % b), b - (x % b), key=abs))
x // base * base