【问题标题】:Firebase realtime database int64 precision lost?Firebase 实时数据库 int64 精度丢失?
【发布时间】:2020-10-28 17:11:47
【问题描述】:

我注意到 int64 类型精度丢失,在我的项目 Firebase 实时数据库中:

  • 当我添加新的孩子或在浏览器中编辑孩子的值时;
  • 当我通过我的 (C++) 代码添加新子项或编辑子项值时:设置为 SetValue(int64_t) 甚至设置为 SetValue(firebase::Variant::kTypeInt64);

53位后开始丢失精度:

//   9007199254740991 <-  I set 53 bits value.."11111111111111111111111111111111111111111111111111111";
//   9007199254740991  -> it records correctly;
//  18014398509481983 <-  I set 54 bits value."111111111111111111111111111111111111111111111111111111";
//  18014398509481984  -> it records as......"1000000000000000000000000000000000000000000000000000000";
// seems it declared as int64_t but saved as float?
  1. 有人可以复制吗?
  2. 是错误还是功能?

【问题讨论】:

    标签: firebase firebase-realtime-database precision int64


    【解决方案1】:

    任何时候您在 Firebase 控制台中处理数据时,都会受到 JavaScript 的限制。 JS 总是存储 numbers 的 64 位 浮点 数字(不是整数)。因此,如果您处理的是 64 位整数,那么如果您使用 JS,则其中一些精度会丢失。

    尝试忽略您在控制台中看到的内容,仅使用正确处理 64 位整数的代码执行读写操作。如果这不起作用,那么实时数据库内部有一些东西会施加类似的限制。据我所知,该文档没有对数字的精度做出任何声明。但是,Firestore(实时数据库的继任者)确实 make a claim 认为 64 位整数是可以的。因此,如果这对您很重要,您可能想要切换(尽管it still does have problems with those numbers in the console,由于 JS 限制)。

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多