【问题标题】:Printed double value differs from originally set value打印的双精度值与初始设置值不同
【发布时间】:2016-11-10 11:12:33
【问题描述】:

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

 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]

添加数组后如何得到精确的双精度值?

【问题讨论】:

标签: swift


【解决方案1】:

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

作为解决方法,您可以在打印时将值四舍五入

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

1.1

2.3

4.2

5.5

6.8

【讨论】:

    【解决方案2】:

    您需要进行如下更改:

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

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

    【讨论】:

    • @shallowThought 你检查输出了吗?
    • @shallowThought 我有检查输出之后我发布了我的答案。
    • 你是对的。我将问题理解为“为什么 1.1(0000000) 变为 1.00000001。您正在修复打印格式。不能重新投票,因为“在答案更新之前投票已锁定”。抱歉。编码愉快!
    【解决方案3】:

    您所看到的 (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:

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多