Swift:从字符串创建双精度值将 0000000000001 附加到结果数字

Ben*_*ner 3 string double casting ios swift

我正在尝试DoubleUITextFieldusing 中获取值Double(myTextField.text!)!。问题是,当我输入某些数字时,我会在数字末尾附加0000000000001。例如,Double("9.05")!给出值9.050000000000001而不是预期的9.05

谁能解释为什么会发生这种情况,以及我如何避免/修复它?

在此先感谢您的帮助。

Rob*_*ier 5

正如一些人所指出的,潜在的问题是,当您以二进制形式存储 9.05 时,会出现舍入错误。所以它没有附加一些价值;它向您显示四舍五入后的正确值(二进制)。这非常类似于以十进制存储 2/3。您最终得到“6.66667”,这似乎是错误的,但由于四舍五入。1/100 是二进制的“0.00000010100011110101...”。

为了得到你想要的,你需要格式化。Ashish 给出了一个工作示例,但在最近的 Swift 版本中它变得更容易了。你不再需要as NSString

import Foundation
let strVal = "9.05"
let doubleVal = Double(strVal)! // Convert String to Double
let formattedStr = String(format: "%.2f", doubleVal) // Double -> String w/ formatting
print(formattedStr)
Run Code Online (Sandbox Code Playgroud)

您可能对 double 值和它如何表示为十进制数字之间的区别感到困惑。你不能用有限数量的二进制数字表达 9.05,就像你不能用有限数量的十进制数字表达 2/3 一样。总会有一些舍入误差。例如,这就是为什么不能安全地与==两个浮点数进行比较的原因。

如果您真正想要的是进行十进制数学,那么您有两种选择:

  • 工作在定点而不是浮点。将所有内容乘以 100 并将其存储为Int. 对于许多问题,这是一个理想的解决方案。
  • NSDecimalNumber. 这在 Cocoa 中可用,并允许您以十进制而不是二进制进行数学运算。9.05NSDecimalNumber正好是 9.05。对于更一般的问题,这是一个很好的解决方案,但实现起来有点困难。

  • 请注意:`Double(strVal)` 随 Swift 2.0 一起提供,不适用于旧版本。 (2认同)