ios - Swift:从 String 创建 double 型将 0000000000001 附加到结果数

标签 ios string swift casting double

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

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

在此先感谢您的帮助。

最佳答案

正如一些人指出的那样,潜在的问题是当您以二进制形式存储 9.05 时,会出现舍入错误。所以它没有附加一些值(value);它在四舍五入后向您显示正确的值(二进制)。这很像以十进制存储 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)

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

如果你真正想要的是做十进制数学,那么你有两个选择:

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

关于ios - Swift:从 String 创建 double 型将 0000000000001 附加到结果数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437769/

相关文章:

ios - 如何附加 ScrollView 的委托(delegate)方法?

ios - swift 合并两个不同的图像

swift - 快速逐字显示文本

c - 当 strnlen() 的最大长度大于实际缓冲区大小时会发生什么?

java - 如何获取 "-"(破折号)前后的文本

ios - 标签栏中的 View Controller (调用另一个 vc 作为弹出窗口),在切换标签时从标签栏层次结构中删除

ios - 根据服务器的响应动态创建表单

ios - AFNetworking 2.0 总是返回 403

ios - NSURLSession 多部分/表单数据发布请求出现问题

ios - 两个同时 ScrollView 表现得很奇怪