【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よね
スクリプトで値をいじっていて、切り上げ、切り捨て、偶数丸めをしたい場面は結構多いです。
RPGならダメージ計算で小数点以下を処理したいですし、Transformでオブジェクトの位置を変更する場合に小数点以下を切り捨てたい時もあります。
そんな時に使えるのがMathfの各種計算メソッド。今回はタイトルにある切り上げ(Ceil)、切り捨て(Floor)、偶数丸め(Round)についてご紹介。
なおRoundは四捨五入ではなく五捨五入になっているので注意。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
Mathfとは
Unityで数学的な計算を簡単に行いたい時に使うのがMathfです。
代表的な所だとサイン、コサイン、タンジェントなどの三角関数だったり、Absで絶対値を取ったりでしょうか。
あとは三角関数との組み合わせでラジアンを度に変えたり、度をラジアンに変えたり。
スクリプトリファレンスを見ると、色々数学的な計算用のメソッドが用意されていて楽しいです。
今回はその中のCeil、Floor、Roundに注目。
切り上げ(Ceil)
切り上げを行いたい時はCeilメソッドを使います。
Ceilingだと「天井」を表す名詞、Ceilだと「天井を張る」という意味の動詞です。
切り上げは天井をイメージすると確かに分かりやすいかも。
切り上げにはCeilメソッドとCeilToIntメソッドの2つが使えます。Ceilメソッドでは戻り値がfloat型、CeilToIntメソッドでは戻り値がint型になっています。
切り上げの方向は正の無限大の方向になっており、例えば10.6なら11.0に、-5.6なら-5.0に切り上げされます。
サンプルコード
試しに小数の値を切り上げしてみます。
切り上げた値の出力は以下のようになります。
どちらも正の無限大の方向に切り上げられていますね。
スクリプトの中で注釈を入れてある通り、int型の変数にMathf.Ceilの結果(float型)を入れようとするとキャストエラーが出るため、明示的に指定する必要があります。
int型からfloat型に値を入れる時は暗黙的に型変換してくれるので、Mathf.CeilToIntを使う時にはそんなに気にしなくていいかも。
切り捨て(Floor)
切り捨てを行いたい時はFloorメソッドを使います。
Floorは「床」を表す名詞だったり、「床を張る」という動詞としても使われる単語です。
切り上げが天井なら、切り捨ては床。分かりやすくていいですね。
切り上げと似ていて、切り捨てではFloorメソッドとFloorToIntメソッドの2つが使えます。Floorメソッドでは戻り値がfloat型、FloorToIntメソッドでは戻り値がint型になっています。
切り捨ての方向は負の無限大の方向になっており、例えば10.6なら10.0に、-5.6なら-6.0に切り捨てされます。
サンプルコード
切り捨ての場合も小数の値を操作してみます。
切り捨てられた値は以下のように出力されます。
どちらも負の無限大の方向で一番近い整数になっています。
Ceilの場合と同様に、戻り値がfloat型のFloorメソッドでは、int型に格納する際、明示的なキャストが必要になります。
偶数丸め(Round)
うっかり四捨五入と混同してしまいがちですが、MathfのRoundでは偶数丸めを行っています。最近接丸めとか、銀行家の丸めとも。
Roundは「丸める」という意味を持ち、そのまま値の丸めを行います。
一番近い整数に丸めるのが基本的な動作で、10.5などのように.5の時には一番近い偶数に丸めます。
例えば10.5なら一番近い整数かつ偶数は10なので10に、11.5なら一番近い整数かつ偶数は12なので12に丸められます。
偶数丸めもfloat型が戻り値のRound、int型が戻り値のRoundToIntの2種類があります。
サンプルコード
偶数丸めの場合にもコンソールへ出力してみます。
今回は出力する値が多め。コンソールへの出力は以下のようになります。
一番近い整数に丸められています。値がx.5の時は偶数の整数に寄せていますね。
2.51など、少しでもx.5を越えれば近い整数に丸められます。
float型 -> int型で明示的なキャストが必要な点はCeil、Floorと同じです。
まとめ
スクリプトで計算結果を切り上げ、切り捨て、偶数丸めしたいケースは多々あります。ぜひ使い方をマスターすべし。
偶数丸めはx.5の時の動きが特殊なのでこれも注意。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】同じコンポーネントが複数アタッチされるのを防ぐ方法 2018.06.30
-
次の記事
【Unity】MathfのDeg2RadとRad2Degの使い方ってちょっと迷うよね 2018.07.04
コメントを書く