前回の
の続きです
 
何故か期待通りの値にならない時があるfloat型ですが
その酷さを簡単に体感できる方法があります
-------------------------------

float a = 0f;
for(int i=0; i<30; i++) {
      a += 0.1f;
      Debug.Log( i + "=" + a );
}
-------------------------------

forループで「a」に0.1fずつ加算し続けるシンプルな作業です

 

予定では

0.1、0.2、0.3…と綺麗に加算されていきそうなものですが

 

結果は次の通り

右側が a の中身です

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

 0 = 0.1

 1 = 0.2

 2 = 0.3

 3 = 0.4

 4 = 0.5

 5 = 0.6

 6 = 0.7

 7 = 0.8000001

 8 = 0.9000001

 9 = 1

10 = 1.1

11 = 1.2

12 = 1.3

13 = 1.4

14 = 1.5

15 = 1.6

16 = 1.7

17 = 1.8

18 = 1.9

19 = 2

20 = 2.1

21 = 2.2

22 = 2.3

23 = 2.4

24 = 2.5

25 = 2.6

26 = 2.7

27 = 2.799999

28 = 2.899999

29 = 2.999999

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

単純な加算でこの有り様じゃぁ…

 

ちなみに下のようなif分があった時にいつまでたっても ifが成立しません

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

float a = 0f;
for(int i=0; i<30; i++) {
      a += 0.1f;

      if( a == 0.8f ){ Debug.Log("HIT"); }
      Debug.Log( i + "=" + a );
}
-------------------------------

aの中身は「0.8f」ではなく「0.8000001f」なので if は不成立なのです

 

という事でfloat型の中身を if で使うには注意しないとバグります

端数処理(小数点以下第X位以降の切り捨てや四捨五入など)をしっかりと行ったほうがよさそうです

 

それについてはまた次回

 

続き↓

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

 

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

●実験環境

・Unity 5.3.5f1 Personal (64bit)

・Windows 10 Pro (64bit)

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