Swift:从String创建一个double将0000000000001追加到结果数字

时间:2015-07-15 18:00:59

标签: ios string swift casting double

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

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

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

正如一些人所指出的,潜在的问题是,当你以二进制形式存储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)

您可能会对双精度值与十进制数字表示方式之间的差异感到困惑。你不能用有限数量的二进制数字表示9.05,就像你不能用有限数量的十进制数字表示2/3一样。总会有一些舍入错误。这就是为什么,例如,你无法安全地与==两个浮点数进行比较。

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

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

答案 1 :(得分:1)

正如Eric D.在评论中定义的那样,请查看http://floating-point-gui.de/basic/

您可以格式化字符串以获得所需的输出:

var strVal = "9.05"
var dbl : Double = (NSString(format: "%.2f", (strVal as NSString).doubleValue)).doubleValue
println(dbl)

它在 Xcode版本6.3.2

中工作

答案 2 :(得分:1)

这是浮点数的二进制表示的一般问题,其中9.05无法准确表示。

在操场上试试这个:

9.05 // 9.050000000000001

所以即使直接初始化值也不是"解决方法"

答案 3 :(得分:0)