【Unity】【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版] 
2017/07/03 Mon [edit]
前回、Math を使った double 型での「倍数での Floor, Ceil, Round」を作ったので、ついでに Unity での Mathf を使った float版 も載せておこう。上手く使えば一定間隔にオブジェクトを配置したり、端数を切り捨てた10・50ポイントごとの得点を加算、45・90度ずつ回転、なんてことも簡単にできる。
|
(※) Unity 5.6.1p3 / Windows10(x64) で確認
●Unity版(float) MultipleFloor, MultipleCeil, MultipleRound
using System;
/// <summary>
/// より小さい倍数を求める(倍数で切り捨てられるような値)
///(例)倍数 = 10 のとき、12 → 10, 17 → 10
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数で切り捨てた値</returns>
public static float MultipleFloor(float value, float multiple)
{
return Mathf.Floor(value / multiple) * multiple;
}
/// <summary>
/// より大きい倍数を求める(倍数で繰り上がるような値)
///(例)倍数 = 10 のとき、12 → 20, 17 → 20
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数で切り上げた値</returns>
public static float MultipleCeil(float value, float multiple)
{
return Mathf.Ceil(value / multiple) * multiple;
}
/// <summary>
/// 倍数での四捨五入のような値を求める(nおきの数の中間の値で切り捨て・切り上げをする)
///(例)倍数 = 10 のとき、12 → 10, 17 → 20
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数の中間の値で、切り捨て・切り上げした値</returns>
public static float MultipleRound(float value, float multiple)
{
return MultipleFloor(value + multiple * 0.5f, multiple); //四捨五入的
//return Mathf.Round(value / multiple) * multiple; //五捨六入的
}
MultipleFloor(v, 5) : 5, 12, 27 → 5, 10, 25
(例)v を10おきに切り捨てる(下1桁を0にする)
MultipleFloor(v, 10) : 5, 12, 27 → 0, 10, 20
MultipleCeil(v, 5) : 5, 12, 27 → 5, 15, 30
(例)v を10おきに切り上げる(倍数で繰り上げる)
MultipleCeil(v, 10) : 5, 12, 27 → 10, 20, 30
MultipleRound(v, 5) : 5, 12, 27 → 5, 10, 25
(例)v を10おきに切り捨て・切り上げる(10の中間の5を閾値として切り捨て・切り上げをする:4→0, 5→10)
MultipleRound(v, 10) : 5, 12, 27 → 10, 10, 30
1つだけ注意点は MultipleRound() に関しては、関数内部で MultipleFloor() を使っている点だ。これは C# の Mathf.Round() の丸め方はどちらかと言うと五捨六入に近いので、他の言語に移植などするとき、そのままでは結果が異なってしまうため、Round(v) の代わりに Floor(v + 0.5) を使っている。この辺りは C# 限定で Mathf.Round の仕様に則った値にしたいなら、コメントアウトしてある方を使っても良いだろう。他の言語との Round の値の違いは以下のページの一覧やフォーラムなどを参照して欲しい。
・Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
・Math.Roundって五捨六入?
(関連記事)
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double版]
【Unity】【C#】n度ごとの角度を返す(一定角度ごとの切り捨て、切り上げ、四捨五入)
Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/248-1ddc51e8
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |