数値を別の数値の倍数に丸め、ゼロから遠ざける一般的な方法。
整数の場合
int RoundNum(int num, int step)
{
if (num >= 0)
return ((num + (step / 2)) / step) * step;
else
return ((num - (step / 2)) / step) * step;
}
フロート用
float RoundNum(float num, float step)
{
if (num >= 0)
return floor((num + step / 2) / step) * step;
else
return ceil((num - step / 2) / step) * step;
}
一部の部分が直感に反しているように見えたり、あまり最適化されていないように見えることはわかっています。(num + step / 2) を int にキャストしようとしましたが、負の浮動小数点数 ((int) -12.0000 = -11
など) に対して間違った結果が得られました。とにかく、これらは私がテストしたいくつかのケースです:
- ステップ 1 に丸められた数値は、それ自体である必要があります
- -3 をステップ 2 に丸める = -4
- -2 をステップ 2 に丸める = -2
- ステップ 2 に丸められた 3 = 4
- ステップ 2 に丸められた 2 = 2
- -2.3 をステップ 0.2 に丸め = -2.4
- -2.4 をステップ 0.2 に丸め = -2.4
- ステップ 0.2 に丸められた 2.3 = 2.4
- ステップ 0.2 に丸められた 2.4 = 2.4