存储大量资金总额和内存/存储影响 - BigDecimal vs Integer 和最佳实践?

Posted

技术标签:

【中文标题】存储大量资金总额和内存/存储影响 - BigDecimal vs Integer 和最佳实践?【英文标题】:Storing a large number of money totals and memory/storage implications - BigDecimal vs Integer and best practices? 【发布时间】:2019-05-15 09:38:42 【问题描述】:

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

当存储数百万个条目时,这当然会导致内存使用量和存储空间的显着增加(例如,使用带有类型描述符的 MongoDB,或似乎对应的 PostgreSQL numeric 类型至少到 8 字节,我不熟悉,例如 Cassandra,所以我不确定会有什么存储影响)。

使用BigDecimal 类型的替代方法是存储美分的整数数量(或选择任何最小面额,即$1 == 10000 hundredths of a cent,根据精度要求) .这不仅会减少程序的压力,还会减少数据集中除最大值之外的所有值所需的存储空间(无论如何这都是异常值,可能需要单独处理)。

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

注意:这仅与存储数据有关,数据仍会根据各种因素以适当的格式显示给用户(即语言环境,例如 $31,383.22美国)。

【问题讨论】:

【参考方案1】: 在数据库方面 DECIMAL 没有问题(但可能在 NOSQL 数据库中)。 在java端BigDecimal也没有问题,如果你不在内存中保存大量数据。另外请注意,整数范围内的普通数字的 BigDecimal 与字符串相当。这些都是可以接受的小对象,java可以很好地处理。

Cents 是可行的,但不能完全避开 BigDecimal。在大多数国家/地区,诸如税收之类的财务计算都需要一定的精度,例如小数点后 6 位。 此外,标准 Java 组件不提供“虚拟”小数点。 从标准输出/输入、JSF 到 JasperReports 等。

值得一提的是,BigDecimal 的用法也很冗长。

所以我会从 BigDecimal 开始,以快速获得一个工作系统,并且仅在大量“电子表格”工作上恢复为 Cents。

【讨论】:

以上是关于存储大量资金总额和内存/存储影响 - BigDecimal vs Integer 和最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

多阶段决策优化 - 动态规划

外商投资企业之投资总额与注册资本的关系

由于“DeFi”项目的影响旨在重塑投资,交易所借贷和支付,硅谷将大量资金押在去中心化加密项目上

为啥 PHP 使用大量内存来存储查询结果

实体中的大量属性会影响数据存储区的读/写性能吗?

电脑显示磁盘空间不足是啥意思