ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]

【Unity】【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]  


 前回、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; //五捨六入的
}

(例)v を5おきに切り捨てる
 MultipleFloor(v, 5) : 5, 12, 27 → 5, 10, 25
(例)v を10おきに切り捨てる(下1桁を0にする)
 MultipleFloor(v, 10) : 5, 12, 27 → 0, 10, 20

(例)v を5おきに切り上げる
 MultipleCeil(v, 5) : 5, 12, 27 → 5, 15, 30
(例)v を10おきに切り上げる(倍数で繰り上げる)
 MultipleCeil(v, 10) : 5, 12, 27 → 10, 20, 30

(例)v を5おきに切り捨て・切り上げる(5の中間の2.5を閾値として切り捨て・切り上げをする:2.4→0, 2.5→5)
 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() 動作互換アルゴリズムを試す


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C# 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/248-1ddc51e8
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop