【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版] 
2017/07/02 Sun [edit]

通常の Floor, Ceil, Round は小数の位を切り捨てたり切り上げたりして1ごとの整数にするものだが、5ごとの値とか10の倍数(下1桁を揃える)にしたいと思うことも少なくない。
ゲームなどで一定間隔の座標に揃えたり、値の下n桁を0したいときなど応用範囲は広いので、毎回書くくらいなら簡単なライブラリとして作っておこう。
■nの倍数で切り捨てる(nおきの数に切り捨てる)
●double 版 MultipleFloor()
using System;
/// <summary>
/// より小さい倍数を求める(倍数で切り捨てられるような値)
///(例)倍数 = 10 のとき、12 → 10, 17 → 10
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数で切り捨てた値</returns>
public static double MultipleFloor(double value, double multiple)
{
return Math.Floor(value / multiple) * multiple;
}
//メインでは…
Console.WriteLine("5 -> " + MultipleFloor(5, 10)); //0
Console.WriteLine("12 -> " + MultipleFloor(12, 10)); //10
Console.WriteLine("27 -> " + MultipleFloor(27, 10)); //20
5, 12, 27 → 0, 10, 20
5, 12, 27 → 5, 10, 25
■nの倍数で切り上げる(nおきの数に繰り上げる)
●double 版 MultipleCeil()
using System;
/// <summary>
/// より大きい倍数を求める(倍数で繰り上がるような値)
///(例)倍数 = 10 のとき、12 → 20, 17 → 20
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数で切り上げた値</returns>
public static double MultipleCeil(double value, double multiple)
{
return Math.Ceiling(value / multiple) * multiple;
}
//メインでは…
Console.WriteLine("5 -> " + MultipleCeil(5, 10)); //10
Console.WriteLine("12 -> " + MultipleCeil(12, 10)); //20
Console.WriteLine("27 -> " + MultipleCeil(27, 10)); //30
5, 12, 27 → 10, 20, 30
5, 12, 27 → 5, 15, 30
■nの倍数で四捨五入のような値を求める(nおきの数の中間の値で切り捨て・切り上げをする)
●double 版 MultipleRound()
using System;
/// <summary>
/// 倍数での四捨五入のような値を求める(nおきの数の中間の値で切り捨て・切り上げをする)
///(例)倍数 = 10 のとき、12 → 10, 17 → 20
/// </summary>
/// <param name="value">入力値</param>
/// <param name="multiple">倍数</param>
/// <returns>倍数の中間の値で、切り捨て・切り上げした値
public static double MultipleRound(double value, double multiple)
{
return MultipleFloor(value + multiple * 0.5, multiple); //四捨五入的
//return Math.Round(value / multiple) * multiple; //五捨六入的(正の数のとき)
}
//メインでは…
Console.WriteLine("5 -> " + MultipleRound(5, 10)); //10
Console.WriteLine("12 -> " + MultipleRound(12, 10)); //10
Console.WriteLine("27 -> " + MultipleRound(27, 10)); //30
5, 12, 27 → 10, 10, 30
5, 12, 27 → 5, 10, 25
1つだけ注意点は MultipleRound() に関しては、関数内部で MultipleFloor() を使っている点だ。これは C# の Math.Round() の丸め方はどちらかと言うと五捨六入に近いので、他の言語に移植などするとき、そのままでは結果が異なってしまうため、Round(v) の代わりに Floor(v + 0.5) を使っている。この辺りは C# 限定で Math.Round の仕様に則った値にしたいなら、コメントアウトしてある方を使っても良いだろう。他の言語との Round の値の違いは以下のページの一覧やフォーラムなどを参照して欲しい。
・Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
・Math.Roundって五捨六入?
(関連記事)
【Unity】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]
Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す
- 関連記事
-
-
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版]
-
【C#】 LowerBound, UpperBound (二分探索)
-
【C#】ソート済み List を動的に作る拡張メソッド
-
【C#】文字列 → float (浮動小数点) 変換でエラーが出るときは…
-
【C#】【Unity】enum 型と string, int 型の相互変換など
-
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/247-464d9dc3
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |