【问题标题】:Why is Firestore rounding numbers of 16+ digits?为什么 Firestore 对 16 位以上的数字进行四舍五入?
【发布时间】:2021-04-05 15:20:11
【问题描述】:

我正在尝试将 Vue 应用程序中的 20 位数字存储在我的 Firestore 数据库中。问题是最后 3 位数字似乎被四舍五入,如果数字以0 开头,则零会被数字截断。 看来问题从超过 16 位的数字开始,如果我在查看数据库时保存 12345678910111213141,它将存储为:12345678910111214000 在这个question 中有一个类似的问题,但是当在程序中检索到这个数字时,它得到了正确的数字,而不是 Firestore 中显示的四舍五入的数字......在我的例子中,我得到了我的四舍五入的值应用程序。 我该如何解决这个问题?

【问题讨论】:

  • 如果它是唯一标识符 number 是错误的类型。唯一标识符最安全的类型是string。如果它确实是一个数字(你正在用它进行数学运算),那么你可能想看看BigInt。请注意,您不能在同一操作中混合使用 numbers 和 bigInt,并且(显然)在从 bigInt 强制转换为 number 时可能会丢失数据。

标签: javascript vue.js google-cloud-firestore


【解决方案1】:

就像另一个问题一样,您的数字超过了 JavaScript 数字的大小,这是一个有符号的 53 位数字。 Firestore 最多可以存储 64 位,如果您尝试在 JavaScript 中读回数字或在控制台中查看,您将丢失数据。 (问题不在于位数,而是数字相对于内部可用于存储的最大位数的大小。)

以 0 开头的数字在写入任何纯数字存储时总是会丢失前导零。前导零对于计算的目的是没有意义的,因此它们从表示中删除。如果出于某种原因想要显示前导零,则应将数字格式化为字符串并在打印之前填充零。

如果您想存储格式化数字而不丢失任何格式,或者如果您想存储大于 64 位的内容,则应将其存储为字符串类型字段而不是数字。但是,您将失去在查询中对其进行理性数学比较的能力。

【讨论】:

  • 总结:不,我无法修复它 XD...感谢您的解释,在我的用例中更改字段类型并不是什么大问题,但很遗憾我可以' t 保持我的数据模型尽可能干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多