结构内部的Swift Floats问题

时间:2018-08-24 13:58:29

标签: swift struct

我遇到一个问题,即swift在结构中时会更改我的float值。我不认为这会在较早版本的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)

3 个答案:

答案 0 :(得分:2)

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

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

Floating Point Converter

关于直接打印浮动对象或打印具有浮动属性的对象之间的区别,归结为实现{{1}的对象的description属性} 协议。当CustomStringConvertible函数要打印到控制台时,它将调用_print_unlocked,这是一个内部函数,具有以下代码块:

print

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

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

答案 1 :(得分:0)

您应该尝试在其中打印值

print(container.f) // prints 4.111

这将返回您存储的内容。

答案 2 :(得分:0)

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)