存储大量资金总额和内存/存储影响 - 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 和最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章