これは、浮動小数点の丸め誤差によるものです。
浮動小数点(double,float)を扱うコンピュータ言語共通の仕様で、
Swift言語特有の問題ではありません。
コンピュータは、2進数(2のn乗の組み合わせ)で数値を表現する機械なので、
実は10進数の少数点を正確に表現できないのです。
例えば、1.2という数値は
2の0乗=1
(2の-1乗=0.5は加算しない)
(2の-2乗=0.25は加算しない)
2の-3乗=0.125
2の-4乗=0.0675
…
といった形で2のマイナスn乗を順次加えて行って、できるだけ1.2に近い値で表現しているだけなのです。
なので、10進数の1.2という値を正確に表現できてないのです。
詳しくは、
http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html
とかを参照してください。
1.2/6.0は、実は内部では
0.19999999999999998
という0.2に近い値で格納されているのですが、
それを表示する際、最終桁を四捨五入して表示する機能が入っていたりするので
print(1.2/6.0)
は0.2と出力されるのだと思います。
print(b)で配列を出力した時は、内部の要素を出力する時に、そういう四捨五入機能が入ってなくて、そのままの値が出ているのだと思います。
もっとわかりやすいというか、危険だということを認識してほしい例があります。
swift
1let c = 1.2/6.0
2if c == 0.2 {
3 print("cは0.2です")
4} else {
5 print("cは0.2ではありません")
6}
をplaygroundで実行してみてください。
「cは0.2ではありません」と出力されると思います。
さらに
swift
1let d = 0.1+0.2
2if d == 0.3 {
3 print("dは0.3です")
4} else {
5 print("dは0.3ではありません")
6}
は「dは0.3ではありません」と出力されると思います。
このように、コンピュータは小学生でもできる0.1+0.2の計算がちゃんとできないのです。
プログラマーは、このことをちゃんと意識してプログラミングする必要があります。
少数点の計算結果がある値と等しいか、==で比較するのは厳禁と考えるべきで、
=や<=で閾値を超えたか否かで比較すべきということです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/06 01:44