【问题标题】:Swift encodes double 0.1 to JSON as 0.10000000000000001Swift 将双 0.1 编码为 JSON 为 0.10000000000000001
【发布时间】:2019-11-09 03:42:17
【问题描述】:

在使用 0.1 值初始化双变量并通过 SwiftyJSON 将其编码为 JSON 后,我在 JSON 结构中收到 0.10000000000000001。

我知道浮点/双精度和整数之间的精确内存存储差异,但除了使用 %.2f 之类的 sprintf 格式外,我仍然没有找到解决这种情况的快速解决方案 - 我不想导致字符串转换成 json 结构。

我们将不胜感激任何快速简便的解决方案。

我希望 JSON 中有 0.1 的值。 如果双精度值为 10,我期望 JSON 中的值为 10。 但是在json编码操作过程中如何避免这样的精度舍入误差呢?

【问题讨论】:

  • 0.10000000000000001 0.1。这样做的不是 Swift,而是两个数字相同的事实。
  • 我已经意识到这一点,我明白从计算的角度来看确实是一样的。但由于视觉方式,我仍然想避免这种情况。两个平台(iOS 和 Android)都将 0.1 值保存到 JSON 中。但实际上,Android 节省了 0.1,而 iOS 节省了 0.10000000000000001。我想消除这种区别
  • 这是浮点数,它们就是这样工作的。如果需要,您可以随时将该数字截断为特定数字。
  • 截断在这里对我没有帮助。看到这个:stackoverflow.com/questions/35946499/…
  • 如何将其格式化并存储为字符串?

标签: json swift type-conversion precision swifty-json


【解决方案1】:

迟到,但对于其他有同样问题的人 - 将您的字段定义为 Decimal 而不是 FloatDouble 是要走的路。

如果您在应用中使用浮点数或双精度数,只需使用例如:

let obj = MyObj(myField: Decimal(myFloat))

然后,当您将 MyObj 序列化为 JSON 时,您应该会看到:

{
  "myfield": 0.1
}

而不是 0.10000000000000001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多