【发布时间】:2017-02-07 18:42:33
【问题描述】:
这是 Xcode 7.3.1 游乐场中的一个简单代码:
var str = "8.7"
print(Double(str))
输出令人惊讶:
Optional(8.6999999999999993)
另外,Float(str) 给出:8.69999981
对这些人有什么想法或理由吗? 任何对此的参考将不胜感激。
另外,我应该如何将“8.7”转换为 8.7 作为 Double(或 Float)?
编辑
迅速:
(str as NSString).doubleValue 返回 8.7
现在,没关系。但是我的问题仍然没有得到完整的答案。我们找到了替代方案,但为什么我们不能依赖 Double("8.7")。请对此提供更深入的了解。
编辑 2
("6.9" as NSString).doubleValue // 打印 6.9000000000000004
所以,问题又来了。
【问题讨论】:
-
使用 print(Double(str)!)
-
如果您的问题是关于 8.7 与 8.69999981,那么您应该阅读 Is floating point math broken? 和 What Every Computer Scientist Should Know About Floating-Point Arithmetic。
-
“双精度浮点格式是一种计算机数字格式,它在计算机内存中占用 8 个字节(64 位),并通过使用浮点来表示广泛的动态值范围。”因此您必须指定值的“精度”(精度是数字中的位数)。
-
@l'L'l,Martin 但为什么将“8.7”转换为 Double 不会导致 8.7 而是 8.69999999999991。这样做有什么意义?如果这真的是在硬件级别上做的,那么 Swift 应该会处理它。 (就像它为 .doubleValue 将其转换为 8.7 但不是为 Double("8.7"))
-
这个问题比我最初想象的更有趣......
标签: ios swift cocoa cocoa-touch