我遇到一个问题,即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)
答案 0 :(得分:2)
这是一个常见的舍入错误,因为二进制不能表示某些十进制数字。看看here。
Here是从十进制到浮点表示的在线转换器。如您所见,由于转换,出现错误(6.103515625E-8
)
关于直接打印浮动对象或打印具有浮动属性的对象之间的区别,归结为实现{{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)