【问题标题】:String to Double conversion loses precision in SwiftString 到 Double 的转换在 Swift 中失去精度
【发布时间】:2016-04-29 10:53:40
【问题描述】:

我想将一个字符串转换成双倍并保持相同的值:

let myStr = "2.40"
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "fr_FR")
let myDouble = numberFormatter.numberFromString(myStr)?.doubleValue ?? 0.0

myDouble 现在是

Double? 2.3999999999999999

那么如何将 "2.40" 转换为精确的 2.40 作为 Double ??

更新:

即使转换后的舍入似乎也不起作用

我不想打印,我想计算,重要的是数字应该正确,这是货币计算和费率

【问题讨论】:

标签: ios floating-point double nsnumberformatter swift2.2


【解决方案1】:

首先:你没有!您在这里遇到的称为浮点不准确性。计算机无法准确存储每个数字。 2.4 不能无损存储在浮点类型中。

其次:由于浮点数始终是个问题,而且您在这里处理金钱(我猜您正在尝试存储 2.4 法郎),您的首要解决方案是:不要使用浮点数 .使用从numberFromString 获得的NSNumber,不要试图从中获得Double
或者通过乘法移动逗号并将其存储为Int

第一个解决方案可能类似于:

if let num = myDouble {
    let value = NSDecimalNumber(decimal: num.decimalValue)
    let output = value.decimalNumberByMultiplyingBy(NSDecimalNumber(integer: 10))
}

【讨论】:

  • 有趣的答案,基本上我会将转换后的数字相乘并将它们相加,然后我将以 2 浮点精度显示数字,如何使用 NSNumber 做到这一点?
  • @iOSGeek 对延迟响应感到抱歉:我稍微编辑了我的答案,以包含一个演示一些计算的小代码截图。显示值与浮点精度问题完全分离。为了显示值,您可以将值四舍五入或让NSNumber 处理显示,这将希望正确显示数字。
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多