经过几次迭代后,迭代数字0.01会增加.0000000000000001

时间:2016-04-10 19:08:19

标签: swift

我正在尝试创建一对1.0到1.25的数字数组。我使用以下代码:

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)

出于某种原因,结果会按预期追加到heightDisplayArray,但会向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更改为一个字符串数组而不是双打,但我更愿意找到导致这种情况发生的原因。

1 个答案:

答案 0 :(得分:1)

此错误是由于Double s的表示精度。 0.01无法准确表示,因此您不时会得到一点点差异。

Cocoa为这样的情况提供了一个解决方案:您可以使用NSDecimalNumber代替。此类精确地表示小数部分,因此您的代码将不会产生与预期数字的差异。

另一种方法是将表示更改为整数,但将每个数字视为厘米数。换句话说,不是存储1.34米,而是存储134厘米。这将允许您以厘米的精度操纵值,并在格式化时将它们更改为米和厘米。