こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityで四捨五入したい!」
「小数点以下の数値を四捨五入して整数にしたい!」
というお悩みの方に向けた内容となっています。
Unityでは、小数点のある数値が出てきた際に、小数点以下を四捨五入して整数にできるメソッドとして、「Mathf.Round」というものが準備されています。
ただし、Mathf.Roundは四捨五入とは少し挙動が異なっていて、小数点が「.5」である場合、偶数の整数になるという「偶数丸め」と呼ばれる方法が取られています。
この偶数丸めという方法は、多くのシステムで使われている計算方法になっています。
そこで、このページでは、Unityで出てきた小数点以下の数値を四捨五入して整数にする方法と、他に切り上げや切り捨てで整数にする方法までを紹介していきます。
Unityで四捨五入するやり方
まずは、Unityで四捨五入するやり方を紹介していきます。
四捨五入ではなく「偶数丸め」で計算される
冒頭でも説明しましたが、Unityでは「四捨五入」ではなく「偶数丸め」で計算することになります。
この偶数丸めとは、その小数点のある数値を最も近い整数にする、また真ん中である「.5」の場合は最も近い偶数の整数にする、となっています。
もう少し具体的に説明すると、整数の「4」と「5」の間にある小数を考えてみると、

偶数丸めでは、「4.5」よりも小さい数は整数の4が近いので全て「4」となり、「4.5」よりも大きい数は整数の5が近いので全て「5」となります。
そして、この真ん中の数値である「4.5」に対しては、4が偶数の整数となるので「4」になります。
例えば、小数点以下を四捨五入する場合は、
「5.1」 ⇒ 「5」
「8.6」 ⇒ 「9」
「6.5」 ⇒ 「7」
「9.5」 ⇒ 「10」
「2.5」 ⇒ 「3」
とそれぞれ計算しますが、四捨五入ではなく偶数丸めの場合は、
「5.1」 ⇒ 「5」
「8.6」 ⇒ 「9」
「6.5」 ⇒ 「6」
「9.5」 ⇒ 「10」
「2.5」 ⇒ 「2」
となり、四捨五入と一部異なる計算結果になる場合があります。
偶数丸めを行うメソッド
Unityで偶数丸めを行うメソッドとして、Mathf.RoundとMathf.RoundToIntがあります。
Mathf.Round:返り値がfloat型
Mathf.Roundは、数学的な変数やメソッドを定義しているMathfクラスのメソッドで、以下のように引数に数値を入れてあげることで、偶数丸めの処理を行います。
Mathf.Round(数値);
また、このMathf.Roundの返り値はfloat型の整数となります。
例えば、以下のようなスクリプトを記述して実行してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
float _num;
void Start()
{
num = 1.5f;
_num = Mathf.Round(num);
Debug.Log(num + " => " + _num);
num = 2.5f;
_num = Mathf.Round(num);
Debug.Log(num + " => " + _num);
}
}

1.5は「2」になっていますが、2.5も「2」になっていて、偶数丸めの処理が行われているのが分かります。
Mathf.RoundToInt:返り値がint型
Mathf.RoundToIntは、Mathf.Roundと同様に引数に入れた数値に対して、偶数丸めの処理を行うメソッドです。
Mathf.RoundToInt(数値);
Mathf.Roundと異なる点は、Mathf.RoundToIntの返り値がint型になっています。
同様にスクリプトを書いて実行してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
int _num;
void Start()
{
num = 1.5f;
_num = Mathf.RoundToInt(num);
Debug.Log(num + " => " + _num);
num = 2.5f;
_num = Mathf.RoundToInt(num);
Debug.Log(num + " => " + _num);
}
}

Mathf.Roundと同じ結果になっているのが分かります。
偶数丸め以外の小数点以下の計算方法
ここまでUnityでの偶数丸めの処理についてまとめていきましたが、ここからは同じように小数点以下の数値に対して切り上げや切り捨てを行う方法を紹介していきます。
小数点以下の切り上げを行うメソッド
Unityで切り上げを行う場合は、Mathf.CeilとMathf.CeilToIntというメソッドがあります。
Mathf.Ceil:返り値がfloat型
Mathf.Ceilは、小数点以下を全て切り上げて、引数に指定した数値以上の最小の整数となるように処理を行います。
Mathf.Ceil(数値);
このMathf.Ceilは、返り値がfloat型となります。
以下のスクリプトを書いて実行してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
float _num;
void Start()
{
num = 1.01f;
_num = Mathf.Ceil(num);
Debug.Log(num + " => " + _num);
num = 1.5f;
_num = Mathf.Ceil(num);
Debug.Log(num + " => " + _num);
num = 1.99f;
_num = Mathf.Ceil(num);
Debug.Log(num + " => " + _num);
}
}

全て切り上げが行われているのが分かります。
Mathf.CeilToInt:返り値がint型
Mathf.CeilToIntも同様に、引数に指定した数値を切り上げて整数で返してくれる処理を行います。
Mathf.CeilToInt(数値);
Mathf.Ceilと異なる点は、返り値がint型となっています。
同様にスクリプトを書いて実行してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
int _num;
void Start()
{
num = 1.01f;
_num = Mathf.CeilToInt(num);
Debug.Log(num + " => " + _num);
num = 1.5f;
_num = Mathf.CeilToInt(num);
Debug.Log(num + " => " + _num);
num = 1.99f;
_num = Mathf.CeilToInt(num);
Debug.Log(num + " => " + _num);
}
}

Mathf.Ceilと同じ結果になっています。
小数点以下の切り捨てを行うメソッド
Unityで切り捨てを行う場合は、Mathf.FloorとMathf.FloorToIntというメソッドがあります。
Mathf.Floor:返り値がfloat型
Mathf.Floorは、小数点以下を全て切り捨てて、引数に指定した数値以下の最大の整数となるように処理を行います。
Mathf.Floor(数値);
このMathf.Floorの返り値はfloat型となります。
以下のスクリプトで実行して確認してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
float _num;
void Start()
{
num = 1.01f;
_num = Mathf.Floor(num);
Debug.Log(num + " => " + _num);
num = 1.5f;
_num = Mathf.Floor(num);
Debug.Log(num + " => " + _num);
num = 1.99f;
_num = Mathf.Floor(num);
Debug.Log(num + " => " + _num);
}
}

それぞれの数値に対して、切り捨ての処理が行われているのが分かります。
Mathf.FloorToInt:返り値がint型
Mathf.FloorToIntも同様に、引数に指定した数値に対して切り捨ての処理が行われるメソッドです。
Mathf.FloorToInt(数値);
このMathf.FloorToIntの返り値はint型となります。
こちらもスクリプトを書いて実行してみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float num;
int _num;
void Start()
{
num = 1.01f;
_num = Mathf.FloorToInt(num);
Debug.Log(num + " => " + _num);
num = 1.5f;
_num = Mathf.FloorToInt(num);
Debug.Log(num + " => " + _num);
num = 1.99f;
_num = Mathf.FloorToInt(num);
Debug.Log(num + " => " + _num);
}
}

Mathf.Floorと同様の結果が得られています。
まとめ
このページでは、Unityで四捨五入するやり方と、切り上げや切り捨ての処理方法についてまとめていきましたが、いかがでしたでしょうか?
Unityでは、四捨五入ではなく偶数丸めという処理をMathf.Roundメソッドで行うことができます。
偶数丸めとは、小数点が「.5」である際に最も近い偶数の整数とする処理のことで、四捨五入と少し挙動が変わります。
また、切り上げはMathf.Ceilメソッド、切り捨てはMathf.Floorメソッドで行うことができます。
最後までお読みいただきまして、ありがとうございました!
コメント