在MongodDB中,有一个数据类型“ Decimal128”,该数据类型可以正确保存小数的值(请参阅“为什么” Here。
在Firebase中存储/使用小数和货币类型的推荐方法是什么?转换成Bigdecimal?还是firestore中的小数类型足以克服舍入问题?
答案 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'-->