-------------------------------

Debug.Log( "Test0=" + (int)( 0.7f * 10 ) );

-------------------------------

これは期待通り"7"と表示される。

 

じゃあこれは?↓

-------------------------------

float a = 0.7f;

Debug.Log( "Test1=" + (int)( a * 10 ) );

-------------------------------

やってる事は同じなのに何故か"6"になります…。理由は不明。

 

"7"と表示させるには

-------------------------------

float a = 0.7f;
float b = a * 10;    // このように一旦float型の変数に計算結果を格納すると正しい値になる
Debug.Log( "Test2=" + (int)b );

-------------------------------

不思議だね!

 

 

型キャストとか計算順番のせい?と思い下のパターンも試しましたがー

-------------------------------

float a = 0.7f;
Debug.Log("Test1=" + (int)((float)a * 10));    // 「6」と表示される。
Debug.Log("Test1=" + (int)((float)(a) * 10));    // 「6」と表示される
Debug.Log("Test1=" + (int)((float)(a * 10)));    // 「6」と表示される…
Debug.Log("Test1=" + (int)((float)(a) * (float)(10)));    // 「6」と表示される!
-------------------------------

謎だ…迷宮入りです…

 

 

「Debug.Log()に直接計算式書くような使い方はしないから自分には関係ないね~へへ~ん」と思っているそこのアナタ様!

-------------------------------

float a = 0.7f;
int b0 = (int)(0.7f * 10);    // 「7」になる。正しい結果。
int b1 = (int)(a * 10);        // 「6」になる…
-------------------------------

下の方は普通にありがちだと思いませんか?

 

俺は見事にハメられました…orz

 

処理の途中で予定していた値と全然違う値に変わってて

一生懸命変数の中身を追跡するという無駄な時間をとられましたとさ…

 

謎バグの温床になりかねん!ヾ(。`Д´。)ノ

一体何だろうねこれ…

 

ちなみに遭遇したfloat型の罠は他にもあります

それはまた次の機会に(恐ろしや…)

 

Unityのfloat型っていまいち不安定な気がするぜ!

 

 

あ、環境は

・Unity 5.3.5f1 Personal (64bit)

・Windows 10 Pro (64bit)

です。

Unityのバージョン上げたら直るんですかね…

 

 

続き↓

[Unity5 C#] float型でハマった罠 その2 "途中で予期せぬ値に変わる時がある"