【问题标题】:How to encode Double in the long format如何以长格式编码 Double
【发布时间】:2020-09-29 01:16:10
【问题描述】:

我使用以下字符串从字符串创建Double:

let doubleValue = Double(value)

value 是 23450000000000000000

在调试器中我看到doubleValue 显示为2.345e+20

我的代码有一个编码器(到编码器:编码器)来编码双值。

try container.encode(doubleValue, forKey: .akey)

当我运行它时,我看到doubleValue 被编码为2.345e+20。 有没有办法以长格式编码doubleValue?即23450000000000000000?

【问题讨论】:

  • 它有什么不同? (可能是 XY 问题)
  • 请注意,Double 不适合用于如此大的数字。你会失去精度。对于如此大的数字,甚至像UInt64 这样的无符号数字就足够了。您需要使用 Decimal 类型并确保使用字符串初始值设定项。
  • 另外,在编码/解码十进制类型时,您需要创建自己的编码和解码方法以保留其值stackoverflow.com/a/62997953/2303865

标签: swift


【解决方案1】:

首先,您想像long 这样打印出来的数字对于UInt64 来说太大了(其中最大值是print(UInt64.max) // 2^64 = 18446744073709551615)。

如果您真的想打印出较大的值,请尝试使用Decimal 类型。以下是一些对我有用的代码:

import UIKit

var str = "Hello, playground"

let doubleValue = Double(23450000000000000000)
Swift.print("hello")
Swift.print(doubleValue)

Swift.print(String(format: "%.0f", doubleValue))
var decimalValue = NSNumber(value: doubleValue).decimalValue
var result = Decimal()
NSDecimalRound(&result, &decimalValue, 0, .plain)
Swift.print(result)

我通过查看 Yervand's answer to this related post 发现的

如果您尝试更大的数字,例如“234500000000000000000000”(其中有几个额外的零),那么您会看到这样做的价值NSDecimalRound。

如果您只是想在 lldb 中打印出您的 doubleValue,请尝试在定义了 doubleValue 的断点处执行 po String(format: "%.0f", doubleValue),您应该会有不错的运气。

【讨论】:

  • 我想知道这如何回答“如何以长格式编码 Double”的问题。如果您将值更改为Double(23450000000000000789),它也会打印“23450000000000000000”
  • 我阅读问题的方式是他想打印出值(无论是通过 print 还是通过 lldb 中的 po),而不是他想将其编码为 Codable。我猜你是想证明大数字的破坏精度?
  • OP 说“有没有办法以长格式对 doubleValue 进行编码?即 23450000000000000000?”答案是肯定的,但他需要使用十进制并对其字节进行编码或将其编码为字符串。使用Decimal 不足以解决编码问题。相关stackoverflow.com/a/62997953/2303865
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多