BigDecimal
类是Java中处理货币单位的标准方法。但是,当存储大量数据(每位用户考虑数百万〜数十亿个条目)时,与诸如int
之类的原语相比,必须考虑额外的存储空间:根据this回答单个{{ 1}}对应大约BigDecimal
个字节(不包括某些元数据描述符等),而36 + Ceiling(log2(n)/8.0)
最通常是int
个字节。
当存储数百万个条目时,这当然不仅会导致内存使用量而且还会显着增加存储空间(例如,将MongoDB与类型为描述符或PostgreSQL 4
类型一起使用)至少与numeric
个字节相对应,例如,我不熟悉Cassandra,所以不确定是否会有什么存储含义。
使用8
类型的另一种方法是存储整数美分(或选择的最小面额为BigDecimal
,如精度要求)。这样不仅可以减轻程序的负担,而且可以减少数据集中除最大值以外的所有数据所需的存储量(无论如何这都是离群值,可能需要单独处理)。
这是可行的选择吗?在这种情况下是否有任何陷阱必须避免?这种方法是否符合当前的标准(例如外部审核)?
注意:这仅与存储数据有关,仍然会根据各种因素以适当的格式向用户显示数据(例如,区域设置,例如$ 31,383.22美国)。
答案 0 :(得分:1)
分是可行的,但不能完全摆脱BigDecimal。在大多数国家/地区,像税这样的财务计算都需要一定的精度,例如6位小数。 同样,标准的Java组件也不提供“虚拟”小数点。 从标准输出/输入,JSF到JasperReports等。
应该提到BigDecimal的用法也很冗长。
所以我将从BigDecimal开始,以快速获得一个工作系统,并且只有在庞大的“电子表格”上,工作才会还原为美分。