如何在Firestore / Node.js中存储/使用小数和货币值

时间:2019-02-03 21:14:06

标签: node.js google-cloud-firestore

在MongodDB中,有一个数据类型“ Decimal128”,该数据类型可以正确保存小数的值(请参阅“为什么” Here

在Firebase中存储/使用小数和货币类型的推荐方法是什么?转换成Bigdecimal?还是firestore中的小数类型足以克服舍入问题?

4 个答案:

答案 0 :(得分:2)

根据documentation,Firestore的浮点类型为64位双精度IEEE754。此格式具有imprecision due to rounding。与其他数据库一样,Firestore中没有“十进制”格式。而且,在Firestore中,没有正式建议使用货币值类型,因此您应该研究以其他方式表示它们的其他方式。网络搜索可能会帮助您。

答案 1 :(得分:1)

我会采用@djoll 提到的类似方法,我们在 Google 做的一个常见事情是存储 amount_micros 而不是 amount,这意味着您只需 1 美元就可以将 1,000,000 存储为int。以这种方式进行数学运算要容易得多。

答案 2 :(得分:0)

正如@Doug所指出的那样,浮点数不精确使得double不适合存储货币(或任何其他需要一致性的十进制值),特别是如果您想对这些存储值进行任何数学运算。

虽然您的解决方案可以使用String类型存储小数,但是如果以后执行数学运算,则可能会引起问题。

一种选择是将货币存储为int'分',然后在向用户显示时将其除以100-因此在存储用户输入之前将其除以100。

例如,尽管double浮动:

print(0.2 + 0.1);
= 0.30000000000000004

代替int x 100:

int x = 20;
int y = 10;
print((x+y)/100);
= 0.3

如果您的项目使用许多不同的货币字段,这可能会变得很笨拙,但是对于大多数事情而言,将int x100用于以100为基础的货币(我认为可以使代码可预测)具有一定的简单性和透明度。

>

答案 3 :(得分:-1)

如果你希望你的 int(比如数字 350)有小数,你可以在客户端添加 '.00' 到它的末尾。例如,在 Angular 2+ 中,您可以使用 the decimal pipe,如下所示:

  {{350 | number:'3.2-5'}}
  <!--output: '350.00'-->