打印的双精度值与原始设定值不同

时间:2016-11-10 11:12:34

标签: swift

我正在添加两个包含双值的数组

 let arrayA = [1.1,2.3]
 let arrayB = [4.2,5.5,6.8]

 let c = arrayA + arrayB

 print("\(c)");

打印功能正在打印以下结果:

[1.1000000000000001, 2.2999999999999998, 4.2000000000000002, 5.5, 6.7999999999999998]

如何在添加数组后获得精确的double值?

3 个答案:

答案 0 :(得分:4)

你没有。这是Double(和Float)的工作方式。

作为解决方法,您可以在打印时对其进行舍入

for num in c {
    print(String(format: "%.1f", num))
}
  

1.1

     

2.3

     

4.2

     

5.5

     

6.8

答案 1 :(得分:1)

您需要更改如下:

定义数组的类型,因为你现在还没有定义。

 let arrayA : [CGFloat] = [1.1,2.3]
 let arrayB : [CGFloat] = [4.2,5.5,6.8]

答案 2 :(得分:1)

您所看到的内容(1.1 - > 1.1000000000000001)的原因在于浮点数的性质。它是由舍入误差引起的,因为实数的无限性质无法在其有限内存(浮点)表示中呈现。

在您的情况下,这可能不是一个大问题,因为您可以更改其他答案中所述的打印格式,但可能导致难以跟踪错误,尤其是在比较浮点数时。例如,以下代码:

let result = 1.1 * 3.0

if result == 3.3 {
    print("I thought so!")
} else {
    print("This might be unexpected")
}

打印:

This might be unexpected

有关详情,建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic