【问题标题】:How to store exact digits in Firestore如何在 Firestore 中存储精确的数字
【发布时间】:2021-02-18 07:00:54
【问题描述】:

如何通过 Objective-C SDK 在 Firestore 中存储数字的准确值?

例如,如果我手动创建一个值为“15.9”的“abv”字段,它会显示该精确值。

但是,如果我从 Objective-C API 更新 Firestore 中的值,并将 NSNumber@(15.9),我会在我的 Firestore 文档中得到这个近似值。

NSDictionary *data = @{@"abv": @(15.9)};
[documentReference updateData:data completion:^(NSError * _Nullable error) {

}];

这是另一个例子。我试图从我的 Objective-C 应用程序中存储值 61.99。我可以从 Web 控制台手动将金额编辑回 61.99。我不明白为什么我可以从 Web 控制台手动输入精确的十进制值,但不能从 Objective-C API 手动输入。

【问题讨论】:

  • 我认为您需要字符串,因为您似乎希望按原样保留用户输入。
  • 当您从 Firestore 获取该字段并在 iOS 设备上的控制台中打印它时,它仍然打印 15.89999... 还是打印正确的 15.9
  • Firestore 将准确地反映您放入其中的内容。它不会以任何方式更改输入数据。您的应用可能会添加此特定值,即使它不是您在代码中表达的内容。
  • @DougStevenson Firestore 将准确返回放入其中的内容,但基于 Web 的管理员可能无法正确呈现 64 位整数(就像它显示在屏幕上一样),尽管它们正确存储在数据库中。这可能只是一个渲染问题。
  • 感谢 cmets,但 Firestore 可以将 15.9 完全存储为数字。我只是不知道如何从 Objective-C SDK 发送这个。如果我将它作为字符串发送,它将被存储为字符串,如果我将它作为数字发送,我会得到不精确。

标签: ios objective-c firebase google-cloud-firestore


【解决方案1】:

这通过使用NSDecimalNumber 解决了这个问题。我现在可以精确地存储两位小数的数字。

NSNumber *number = (NSNumber *)value;
NSString *text = [NSString stringWithFormat:@"%.2f", number.doubleValue];
NSDecimalNumber *decimalNumber = [[NSDecimalNumber alloc] initWithString:text];
return decimalNumber;

【讨论】:

    【解决方案2】:

    这是一个已知的浮点数精度问题,并且有据可查。 您可以在将数字写入 Firestore 之前处理该数字,即将输入作为字符串写入 Firestore,然后再处理该数字。这个Blog 详细介绍了它,我认为会更好地处理您的情况,或者正如@skaak 所说,将值作为字符串写入firestore 并使用博客中描述的方法进行处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2021-07-18
      相关资源
      最近更新 更多