为啥 Firestore 舍入 64 位整数?

Posted

技术标签:

【中文标题】为啥 Firestore 舍入 64 位整数?【英文标题】: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。 【参考方案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

以上是关于为啥 Firestore 舍入 64 位整数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 as_tibble() 将浮点数舍入到最接近的整数?

Javascript基础语法

64位win7为啥每次打开xscan都提示丢失NPPTools.dll

javascript的Math.round()函数为啥不能精确小数点位数,

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

为啥 int 在 Python 中需要三倍的内存?