【问题标题】:Issue with Swift Floats inside Structs结构内的 Swift 浮动问题
【发布时间】:2018-08-24 13:58:28
【问题描述】:

我遇到了一个问题,即 swift 在结构内部时会更改我的浮点值。我认为这不会发生在旧版本的 swift 上,但它现在正在 4.1 上发生。下面的代码示例...想法?

var f = Float(4.111)

print(f) // prints 4.111

struct FloatContainer {
    var f: Float
}

let container = FloatContainer(f: f)

print(container) // prints FloatContainer(f: 4.11100006)

【问题讨论】:

标签: swift struct


【解决方案1】:

这是一个常见的舍入错误,因为二进制不能代表一些十进制数。看看here

Here 是一个从十进制到浮点表示的在线转换器。如您所见,由于转换存在错误(6.103515625E-8):

关于直接打印浮点数与打印具有浮点数属性的对象之间的区别,归结为实现CustomStringConvertible 协议的对象的description 属性。当print 函数想要打印到控制台时,它会调用_print_unlocked,这是一个具有此块的内部函数:

if case let printableObject as CustomStringConvertible = value {
    printableObject.description.write(to: &target)
    return
}

因此,您可以将代码更改为此以获得预期的输出:

struct FloatContainer : CustomStringConvertible {
    var description: String {
        get {
            return f.description
        }
    }
    var f: Float
}

【讨论】:

  • 这还不能解释为什么 same value f 在一个地方打印为 4.111,而在另一个地方打印为 4.11100006。
【解决方案2】:

你应该尝试打印里面的值

print(container.f) // prints 4.111

这将返回您存储的内容。

【讨论】:

  • 仍然没有解释为什么引用结构与实际值时值不同。
【解决方案3】:

Swift 为任何类型提供默认调试表示,这就是 Apple documentation 的原因

 var f = Float(4.111)

    print(f) // prints 4.111

    print(f.debugDescription) // prints 4.11100006
    print(String(reflecting: f)) // default presentation according to documentation: prints 4.11100006

    struct FloatContainer: CustomStringConvertible {
        var f: Float

        // You can achieve similar output to `print(f)` with conforming
        // to `CustomStringConvertible` and implementing custom 
        // `description` implementation
        var description: String {
            return f.description
        }
    }

    let container = FloatContainer(f: f)
    // After our custom implementation the result of `print` 
    // method is the same to print(f)
    print(container) // prints FloatContainer(f: 4.111)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多