【问题标题】:Converting String to Double/Float loses precision for large numbers in Swift 5在 Swift 5 中将字符串转换为 Double/Float 会丢失大数的精度
【发布时间】:2021-08-06 13:08:55
【问题描述】:

当我将“0.0000335651599321165”字符串值转换为双精度时

let value = "0.0000335651599321165"
var doubleValue = Double(value)

它返回值 3.36597214193249e-05。 如何在 swift 5 中获取原始号码。

【问题讨论】:

  • 使用Decimal,而不是DoubleFloatDouble 的精度都比您要求的要小(甚至不说十进制到二进制的精度损失)。
  • 除了 Float 和 Double 等浮点数的不精确性之外,您应该注意"3.36597214193249e-05 的科学记数法只是数字表示的一个方面。您的 Double 完全有可能是您想要的值,但为了便于阅读,以这种方式表示。如果此号码用于向用户展示,则应始终使用NumberFormatter
  • 获得准确数字的要点是将该数字四舍五入到最多 6 位

标签: swift


【解决方案1】:

如果你想保持你的浮动精度,你需要使用 Decimal 类型并确保使用它的字符串初始化器:


let value = "0.0000335651599321165"
if let decimal = Decimal(string: value) {
    print(decimal)
}

这将打印:

0.0000335651599321165


编辑/更新:

当使用固定的小数位数向用户显示您的值时,您可以使用数字格式化程序,您也可以选择舍入模式:


extension Formatter {
    static let number = NumberFormatter()
}

extension Numeric {
    func fractionDigits(min: Int = 6, max: Int = 6, roundingMode: NumberFormatter.RoundingMode = .halfEven) -> String {
        Formatter.number.minimumFractionDigits = min
        Formatter.number.maximumFractionDigits = max
        Formatter.number.roundingMode = roundingMode
        Formatter.number.numberStyle = .decimal
        return Formatter.number.string(for: self) ?? ""
    }
}

let value = "0.0000335651599321165"
if let decimal = Decimal(string: value) {
    print(decimal.fractionDigits())  // "0.000034\n"
}

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2016-06-01
    • 1970-01-01
    • 2022-09-20
    相关资源
    最近更新 更多