たまにはUnityの話でもするかということで、Unity上で数値=Floatの危険な考え方についての記事を書く。

 

大体1本2本くらいソフト作った開発者や、コンピューター系の学校出てる人は知ってるかもだけど、Floatという型は案外使い勝手が悪い。

何故かというと、浮動小数点というモノの性質のせいだ。

 

Unityで座標を細かく設定したり、角度を調整したりするとよくある事だが、0.000001くらいの細かな誤差で座標がずれてくることがある。

通常であれば、全く気にすることのない程度の誤差だが、MMORPGなどを作っているとこれが大問題になる。

勘の良い人はもう気付いたかもしれないが、MMO内でのプレイヤーの資産等も、この誤差により必ずしも正確ではない数字になる事がある。

 

特に課金ポイント、昨日まで250ポイントくらい持ってたはずなのに、今日なぜか249ポイントになっていたという現象が起きるわけである。

そうなってくると、せっかく楽しんでもらってお金まで頂いたというのに、警察沙汰になりかねない。

 

だから、重要なところでは、キッチリ整数を使いましょう。

マイナス値を扱わないのであれば、19ケタまで自由に使えるulong型がオススメです。(9が19個)

もっと大きな数字を使いたい場合も、System.Numerics.BigIntegerというクラスを使えばいけるようです。

困った事になる前に、適切な型の変数を利用しましょう。

 

ちなみに、Floatは比較の際に0比較しないほうが良いことも言っておきます。

IF( 1f – 1f == 0 )

一見正しい式に見えますが、FloatやDoubleの場合、必ずしも0イコールになるとは限りません。

IF( 1f – 1f < Float.Epsilon )

このように書きましょう。(Epsilonは任意の誤差値で置き換えても良い。)