Ios 如何在Firestore中存储精确数字

Ios 如何在Firestore中存储精确数字,ios,objective-c,firebase,google-cloud-firestore,Ios,Objective C,Firebase,Google Cloud Firestore,如何从Objective-C SDK在Firestore中存储数字的精确值 例如,如果我手动创建一个值为“15.9”的“abv”字段,它将显示确切的值 但是,如果我使用NSNumber值@(15.9)从Objective-C API更新Firestore中的值,我会在Firestore文档中获得该近似值 这是另一个例子。我试图存储Objective-C应用程序中的值61.99。我可以从web控制台手动将金额编辑回61.99。我不明白为什么我可以从web控制台手动输入精确的十进制值,但不能从O

如何从Objective-C SDK在Firestore中存储数字的精确值

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

但是,如果我使用
NSNumber
@(15.9)
从Objective-C API更新Firestore中的值,我会在Firestore文档中获得该近似值

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


这是一个已知的问题,浮标的数值精度和记录良好。
您可以在将数字写入firestore之前对其进行处理,即将输入保持为字符串,然后将其写入firestore并处理数字。这是关于它的一些细节,我认为将更好地处理您的案例,或者正如@skaak所说的保留为字符串,将值写入firestore并使用博客中描述的方法进行处理。

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

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

我认为您需要字符串,因为您似乎希望保留用户输入。当您从Firestore获取该字段并在iOS设备上的控制台中打印它时,它是否仍然打印
15.89999…
,还是打印正确的
15.9
?Firestore将准确反映您在其中输入的内容。它不会以任何方式更改输入数据。很可能是您的应用程序正在添加此特定值,即使它不是您在代码中表示的值。@DougStevenson Firestore将准确返回放入其中的值,但基于web的管理员可能无法正确呈现64位整数(就像屏幕上显示的那样),尽管它们已正确存储在数据库中。这可能只是一个渲染问题。感谢您的评论,但是Firestore可以将
15.9
精确地存储为一个数字。我只是不知道如何准确地从Objective-CSDK发送这个。如果我将它作为字符串发送,它将被存储为字符串,如果我将它作为数字发送,则会得到不精确性。
NSNumber *number = (NSNumber *)value;
NSString *text = [NSString stringWithFormat:@"%.2f", number.doubleValue];
NSDecimalNumber *decimalNumber = [[NSDecimalNumber alloc] initWithString:text];
return decimalNumber;