我一直在研究一个应用程序。与购物业务有关。
有一个模型具有:
private Float count;
private Long price;
由于大量的count * price
和price
,我想知道count
的最佳Java数据类型。
另一方面,price
* count
操作时不会发生溢出。
答案 0 :(得分:4)
作为解决方案,您可以考虑使用JavaMoney.org库on GitHub。该库实现了JSR 354: Money and Currency API规范。
该API的目标:
如果您当然不想使用任何库,则应该使用BigDecimal
。
答案 1 :(得分:2)
最大值:
Float
是Float.MAX_VALUE
,是(2-2 ^ 23)* 2 ^ 127,类似3.40282346638528860e + 38或340,282,346,638,528,860,000,000,000,000,000,000,000,000,000.000000。Long
是Long.MAX_VALUE
,2 ^ 63-1或9,223,372,036,854,776,000。您正在经营哪种类型的购物业务不适合这些类型?
实际上,您不想要Float
是基于floating-point技术的简单原因,而且您永远不会使用浮点数赚钱。在精度要求很高的任何情况下,切勿使用浮点数。执行的浮点数trades away accuracy for speed。通常,您的客户会在乎钱。因此,您永远不会在Java中将float
,Float
,double
或Double
类型用于此类目的。这种解决方法很容易出现混乱和错误,因此需要仔细的文档和编码。
BigDecimal
在准确性方面,例如金钱,请使用BigDecimal
。不是因为它可以处理大量数字,而是因为它是准确的。缓慢但准确。
使用BigDecimal
的建议仅适用于小额金额,例如跟踪一美元的便士。如果仅使用整数,则不需要BigDecimal
。
对于缺少BigDecimal
之类的语言的语言,浮点问题的解决方法是将所有小数部分乘以直到它们成为整数。例如,如果对美元上的便士进行记账,则将所有金额乘以100,以将整个便士的计数保留为整数,而不是分数的计数。
至于在Java中处理整数,您有multiple simple choices。
Byte
和byte
或8 bits。short
或Short
,并使用16 bits。int
或Integer
,并使用32 bits。long
或Long
,并使用64 bits。BigInteger
。 通常最好使用最小的整数类型,该类型可以舒适地适合您的当前值以及适合可预见的将来值。
32位或64位类型是现代硬件的主要选择。您不必担心最小的类型,除非使用大量的这些值,或者它们在内存上受到很大限制。对于大多数面向业务的应用程序,使用BigInteger
是过大的。 (科学和工程应用可能是个不同的故事。)
另请参见 JSR 354:货币和货币API 库中的Answer by i.merkurev。
答案 2 :(得分:0)
对于巨大的值,有BigDecimal或BigInteger类。我将在您的情况下使用BigDecimal。此类永远不会溢出。