2016-04-10 18 views
1

1.0から1.25までの数の配列を作成しようとしています。結果はheightDisplayArrayに予想通り追加されますが、heightArrayに、いくつかの予想外の数字を追加して、いくつかの理由数値を0.01回繰り返すと、数回繰り返した後に.0000000000000001が加算されます。

heightDisplayArray: [String] = [] 
heightArray: [Double] = [] 

for i in 1.stride(to: 1.25, by: 0.01){ 

    heightDisplayArray.append("\(i) meters") 
    heightArray.append(i) 

} 

print (heightDisplayArray) 
print (heightArray) 

:私は、次のコードを使用します。コンソールには次の情報が表示されます。

["1.0 meters", "1.01 meters", "1.02 meters", "1.03 meters", "1.04 meters", "1.05 meters", "1.06 meters", "1.07 meters", "1.08 meters", "1.09 meters", "1.1 meters", "1.11 meters", "1.12 meters", "1.13 meters", "1.14 meters", "1.15 meters", "1.16 meters", "1.17 meters", "1.18 meters", "1.19 meters", "1.2 meters", "1.21 meters", "1.22 meters", "1.23 meters", "1.24 meters"] 

[1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.0600000000000001, 1.0700000000000001, 1.0800000000000001, 1.0900000000000001, 1.1000000000000001, 1.1100000000000001, 1.1200000000000001, 1.1300000000000001, 1.1400000000000001, 1.1500000000000001, 1.1600000000000001, 1.1700000000000002, 1.1800000000000002, 1.1900000000000002, 1.2000000000000002, 1.2100000000000002, 1.2200000000000002, 1.2300000000000002, 1.2400000000000002] 

どのようにこの動作を修正できますか?私はheightArrayをDoublesの代わりにStringの配列に変更することができましたが、実際にこれが発生する原因を見つけることを好むでしょう。

+5

http://stackoverflow.com/questions/588004/is-floating-point-math-broken – Mat

答えて

1

このエラーは、表現の精度がDoubleであるためです。 0.01は正確に表現することができないため、今は少しずつ違いがあります。

ココアはそのような状況ではソリューションを提供しています。代わりにNSDecimalNumberを使用できます。このクラスは小数部分を正確に表しているため、コードでは予想される数との違いは生じません。

もう1つの方法は、表現を整数に変更することですが、各数値をセンチメートルの数として扱います。言い換えれば、1.34mを保管する代わりに134cmを保管します。これにより、センチメートルの精度で値を操作し、フォーマット時にメートルとセンチメートルに変更することができます。

関連する問題