Java中的大数据类型

时间:2018-12-26 06:27:12

标签: java overflow

我一直在研究一个应用程序。与购物业务有关。
有一个模型具有:

 private Float count;
 private Long price;

由于大量的count * priceprice,我想知道count的最佳Java数据类型。

另一方面,price * count操作时不会发生溢出。

3 个答案:

答案 0 :(得分:4)

JSR 354:货币和货币API

作为解决方案,您可以考虑使用JavaMoney.org库on GitHub。该库实现了JSR 354: Money and Currency API规范。

该API的目标:

  1. 提供用于处理和计算金额的API
  2. 定义代表货币和货币金额以及货币舍入的类
  3. 处理货币汇率
  4. 处理货币和金额的格式和解析

如果您当然不想使用任何库,则应该使用BigDecimal

答案 1 :(得分:2)

最大值:

  • FloatFloat.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。
  • LongLong.MAX_VALUE,2 ^ 63-1或9,223,372,036,854,776,000。

您正在经营哪种类型的购物业务不适合这些类型?

浮点数

实际上,您不想要Float是基于floating-point技术的简单原因,而且您永远不会使用浮点数赚钱。在精度要求很高的任何情况下,切勿使用浮点数。执行的浮点数trades away accuracy for speed。通常,您的客户会在乎钱。因此,您永远不会在Java中将floatFloatdoubleDouble类型用于此类目的。这种解决方法很容易出现混乱和错误,因此需要仔细的文档和编码。

BigDecimal

在准确性方面,例如金钱,请使用BigDecimal。不是因为它可以处理大量数字,而是因为它是准确的。缓慢但准确。

使用BigDecimal的建议仅适用于小额金额,例如跟踪一美元的便士。如果仅使用整数,则不需要BigDecimal

分数的整数解决方法

对于缺少BigDecimal之类的语言的语言,浮点问题的解决方法是将所有小数部分乘以直到它们成为整数。例如,如果对美元上的便士进行记账,则将所有金额乘以100,以将整个便士的计数保留为整数,而不是分数的计数。

整数

至于在Java中处理整数,您有multiple simple choices

  • 对于127及以下的数字,请使用Bytebyte8 bits
  • 对于32,767及以下的数字,请使用shortShort,并使用16 bits
  • 对于2 ^ 31-1以下(约20亿)的数字,请使用intInteger,并使用32 bits
  • 对于2 ^ 63-1及以下(约数个十亿亿兆赫兹)的数字,请使用longLong,并使用64 bits
  • 对于更大的数字,请使用BigInteger

通常最好使用最小的整数类型,该类型可以舒适地适合您的当前值以及适合可预见的将来值。

32位或64位类型是现代硬件的主要选择。您不必担心最小的类型,除非使用大量的这些值,或者它们在内存上受到很大限制。对于大多数面向业务的应用程序,使用BigInteger是过大的。 (科学和工程应用可能是个不同的故事。)


另请参见 JSR 354:货币和货币API 库中的Answer by i.merkurev

答案 2 :(得分:0)

对于巨大的值,有BigDecimal或BigInteger类。我将在您的情况下使用BigDecimal。此类永远不会溢出。