【问题标题】:Why is Firestore rounding 64 bit integers?为什么 Firestore 舍入 64 位整数?
【发布时间】:2019-12-16 07:00:58
【问题描述】:

我正在尝试将来自 python 程序的 64 位整数存储在我的 Firestore 数据库中。问题是最后一位数字似乎被四舍五入了。

doc = db.collection('questions').document('0MPvbeTEglD9lbpDq6xm')
ints = [9223372036854775807, 9223372036854775533, 9223372036854775267]
doc.update({
    'random': ints
})

当我查看数据库时,它们存储为:

random = [9223372036854776000, 9223372036854776000, 9223372036854775000}

根据the documentation 支持64 位有符号整数。可能是什么问题?

【问题讨论】:

  • 数字是四舍五入还是截断?
  • 我该如何解决?
  • 截断意味着数字被“截断”。例如,如果您有 0.1234567,并且该数字在第 4 位之后被截断,则它变为 0.1234,而不必将数字四舍五入,而自行四舍五入意味着它变为 0.123457,或者如果您四舍五入到最接近的整数,则简单地为 0。

标签: python google-cloud-firestore integer


【解决方案1】:

我不能 100% 确定,但我的猜测是,您看到的是由于 JavaScript 整数不是 64 位大小的事实。它们实际上更像53 bits。由于 Firebase 控制台是使用 JavaScript 实现的网络应用程序,它可能无法理解您向其写入的全部 64 位非常大的整数。

我建议使用另一个 python 程序从文档中读取值,而不是检查控制台中的值。如果它们与您写的相同,那么这里就没有真正的问题。您只是不能相信控制台中值的呈现。

【讨论】:

  • 就是这样,当我用 Python 程序获取它们时,它们返回正确。
  • 不幸的是,这不是纯粹的可读性。我们有一个云函数,它将新的 firestore 数据附加到带有 onWrite 触发器的谷歌电子表格中,并且文档中的 long 值以 53 位表示形式写入。
  • 这似乎是 Javascript Firestore API 中无法接受的过度简化......它可以引入自定义整数类型,就像它对 Timestamp 所做的那样,可能有一个可配置的选项来启用它,无论如何。数据库 API 丢失数据是不可接受的。
  • @cubuspl42 您可以随时提交功能请求。 support.google.com/firebase/contact/support
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多