前置き
Verse の丸め処理の関数(Floor / Ceil / Round / Int)の処理結果を比較し、また、それら関数の使い分けについて調べました。
丸め処理とは?
数値を指定された桁数や単位で近似する(調整する) ことです。
これから紹介する関数は 小数を整数に変換する処理 で、どの方向に丸めるかによって結果が変わります。
ゲーム制作では、目的に応じて適切な関数を選びます。
丸め関数の一覧と特徴
| 関数 | 丸め方向 | 境界値 0.5 の扱い | 使う場面例 |
|---|---|---|---|
| Floor[] | 小さい方へ(切り捨て) | 常に切り捨て | 所持数・座標の下限処理 |
| Ceil[] | 大きい方へ(切り上げ) | 常に切り上げ | クラフト素材・ページ数 |
| Round[] | 最も近い整数へ | 偶数丸め(IEEE-754) | 表示値・統計処理 |
| Int[] | ゼロ方向へ(符号無視) | 常にゼロ方向 | 座標変換・小数抽出 |
🔢 計算結果の比較
検証用コード・出力結果
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
float_to_int_test_device := class(creative_device):
OnBegin<override>()<suspends>:void=
Print("=== 4つの丸め関数の比較 ===")
# 正の数:小数部分による違いを確認
CompareRounding(3.2) # 小数部分 < 0.5 → Roundは切り捨て側
CompareRounding(3.5) # 小数部分 = 0.5 → Roundの境界値(.5の丸め方)
CompareRounding(3.8) # 小数部分 > 0.5 → Roundは切り上げ側
# 負の数:FloorとIntの違いが顕著に現れる
CompareRounding(-2.3) # Floor=-3(小さい方), Int=-2(ゼロ方向)
CompareRounding(-2.5) # 負の数での.5の扱い
CompareRounding(-2.7) # 負の数でも小数部分の影響を確認
# ゼロ近傍:ゼロをまたぐときの挙動
CompareRounding(0.9) # 正でゼロに近い → Intは0を保つ
CompareRounding(-0.9) # 負でゼロに近い → 正負での挙動の違いを確認
# 4つの丸め関数を比較する関数
CompareRounding(Value:float):void=
if:
ResultFloor := Floor[Value]
ResultCeil := Ceil[Value]
ResultRound := Round[Value]
ResultInt := Int[Value]
then:
Print("値: {Value}")
Print(" Floor : {ResultFloor} (負の無限大方向へ)")
Print(" Ceil : {ResultCeil} (正の無限大方向へ)")
Print(" Round : {ResultRound} (最近傍へ、.5は偶数方向へ)")
Print(" Int : {ResultInt} (ゼロ方向へ)")
Print("")
=== 4つの丸め関数の比較 ===
値: 3.200000
Floor : 3 (負の無限大方向へ)
Ceil : 4 (正の無限大方向へ)
Round : 3 (最近傍へ、.5は偶数方向へ)
Int : 3 (ゼロ方向へ)
値: 3.500000
Floor : 3 (負の無限大方向へ)
Ceil : 4 (正の無限大方向へ)
Round : 4 (最近傍へ、.5は偶数方向へ)
Int : 3 (ゼロ方向へ)
値: 3.800000
Floor : 3 (負の無限大方向へ)
Ceil : 4 (正の無限大方向へ)
Round : 4 (最近傍へ、.5は偶数方向へ)
Int : 3 (ゼロ方向へ)
値: -2.300000
Floor : -3 (負の無限大方向へ)
Ceil : -2 (正の無限大方向へ)
Round : -2 (最近傍へ、.5は偶数方向へ)
Int : -2 (ゼロ方向へ)
値: -2.500000
Floor : -3 (負の無限大方向へ)
Ceil : -2 (正の無限大方向へ)
Round : -2 (最近傍へ、.5は偶数方向へ)
Int : -2 (ゼロ方向へ)
値: -2.700000
Floor : -3 (負の無限大方向へ)
Ceil : -2 (正の無限大方向へ)
Round : -3 (最近傍へ、.5は偶数方向へ)
Int : -2 (ゼロ方向へ)
値: 0.900000
Floor : 0 (負の無限大方向へ)
Ceil : 1 (正の無限大方向へ)
Round : 1 (最近傍へ、.5は偶数方向へ)
Int : 0 (ゼロ方向へ)
値: -0.900000
Floor : -1 (負の無限大方向へ)
Ceil : 0 (正の無限大方向へ)
Round : -1 (最近傍へ、.5は偶数方向へ)
Int : 0 (ゼロ方向へ)
A. 正の数での比較
| Value | Floor | Ceil | Round | Int |
|---|---|---|---|---|
| 3.2 | 3 | 4 | 3 | 3 |
| 3.5 | 3 | 4 | 4 | 3 |
| 3.8 | 3 | 4 | 4 | 3 |
B. 負の数での比較
| Value | Floor | Ceil | Round | Int |
|---|---|---|---|---|
| -2.3 | -3 | -2 | -2 | -2 |
| -2.5 | -3 | -2 | -2 | -2 |
| -2.7 | -3 | -2 | -3 | -2 |
負の数では Floor と Int の違いが最も明確になります。
- Floor: -2.3を 小さい方(負の無限大) の -3 へ
- Int: -2.3を ゼロ方向 の -2 へ
C. ゼロ近傍での比較
| Value | Floor | Ceil | Round | Int |
|---|---|---|---|---|
| 0.9 | 0 | 1 | 1 | 0 |
| -0.9 | -1 | 0 | -1 | 0 |
D. (補足)Round[] の偶数丸めの例
Round[] は 「四捨五入」 とよく言われますが、.5 の境界値では 偶数丸め のルールが適用されます。
| Value | Roundの結果 | 適用ルール |
|---|---|---|
| 3.5 | 4 | 最も近い偶数(3と4で4) |
| 2.5 | 2 | 最も近い偶数(2と3で2) |
🎮 ゲーム制作での丸め処理の使い分け
🥇 Floor[](切り捨て)
👉 「余りは捨てて、確実に持っている分だけ」扱いたいとき
- リソース管理: 3.8 個のアイテム → 実際に使えるのは 3 個
- 座標計算: float 座標をグリッドの 左上(小さい方) に変換
- 経験値: 端数は切り捨てて、次のレベルに持ち越さない
🥈 Ceil[](切り上げ)
👉 「不足を許さず、必ず足りるように」扱いたいとき
- クラフト: 3.2 個必要 → 実際には 4 個要求
- ダメージ: 0.1 ダメージでも最低 1 ダメージにする
-
ページ数: 要素 N を M 個ずつ表示 → ページ数は
Ceil[N/M]
🥉 Round[](四捨五入)
👉 「一番近い整数にして、公平に」扱いたいとき
- 表示ダメージ: 150.6 → 151 と表示(プレイヤーに自然に見える)
- 統計値: 平均値や結果を丸めて表示
🏅 Int[](ゼロ方向の切り捨て)
👉 「符号に関係なく小数点以下を無視」したいとき
- 座標変換: float → int に変換し、中心 0 からの相対位置を取得
-
小数部分の抽出:
X - Int(X)で小数点以下だけを取り出す
✅ まとめイメージ
- Floor → 「持っている分だけ」(確実に切り捨てたいとき)
- Ceil → 「足りない分も確保」(確実に切り上げたいとき)
- Round → 「一番近い整数」(公平な四捨五入に近い処理をしたいとき)
- Int → 「小数点以下を無視」(符号を気にせず整数部分だけほしいとき)