要存储大量的货币总数以及对内存/存储的影响-BigDecimal与Integer以及最佳做法?

时间:2019-05-15 09:38:42

标签: java bigdata storage currency bigdecimal

BigDecimal类是Java中处理货币单位的标准方法。但是,当存储大量数据(每位用户考虑数百万〜数十亿个条目)时,与诸如int之类的原语相比,必须考虑额外的存储空间:根据this回答单个{{ 1}}对应大约BigDecimal个字节(不包括某些元数据描述符等),而36 + Ceiling(log2(n)/8.0)最通常是int个字节。

当存储数百万个条目时,这当然不仅会导致内存使用量而且还会显着增加存储空间(例如,将MongoDB与类型为描述符或PostgreSQL 4类型一起使用)至少与numeric个字节相对应,例如,我不熟悉Cassandra,所以不确定是否会有什么存储含义。

使用8类型的另一种方法是存储整数美分(或选择的最小面额为BigDecimal,如精度要求)。这样不仅可以减轻程序的负担,而且可以减少数据集中除最大值以外的所有数据所需的存储量(无论如何这都是离群值,可能需要单独处理)。

这是可行的选择吗?在这种情况下是否有任何陷阱必须避免?这种方法是否符合当前的标准(例如外部审核)?

注意:这仅与存储数据有关,仍然会根据各种因素以适当的格式向用户显示数据(例如,区域设置,例如$ 31,383.22美国)。

1 个答案:

答案 0 :(得分:1)

  • 在数据库方面, DECIMAL 没问题(虽然可能在NOSQL数据库中)。
  • 在Java方面,如果您不将大量数据保留在内存中,则 BigDecimal 也没有问题。还请注意,在整数范围内的普通数字的BigDecimal与String相当。这些是可接受的小对象,Java可以很好地处理。

是可行的,但不能完全摆脱BigDecimal。在大多数国家/地区,像税这样的财务计算都需要一定的精度,例如6位小数。 同样,标准的Java组件也不提供“虚拟”小数点。 从标准输出/输入,JSF到JasperReports等。

应该提到BigDecimal的用法也很冗长。

所以我将从BigDecimal开始,以快速获得一个工作系统,并且只有在庞大的“电子表格”上,工作才会还原为美分。