java 中的大数据类型

Big datatype in java

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

 private Float count;
 private Long price;

我想知道 count * price 的最佳 java 数据类型,因为 pricecount 的数量巨大。

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

对于巨大的值,有 BigDecimal 或 BigInteger 类。我将在您的案例中使用 BigDecimal。这个 类.

你永远不会溢出

JSR 354:货币与通货 API

作为解决方案,您可以考虑使用 JavaMoney.org 库 on GitHub. This library implements the JSR 354: Money and Currency API 规范的方法。

API的目标:

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

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

最大值:

  • Float is Float.MAX_VALUE, (2-2^23)*2^127, 类似于 3.40282346638528860e+38 或 340,282,346,638,528,860,000,000,000,000,000,000,000.000000.
  • LongLong.MAX_VALUE、2^63-1 或 9,223,372,036,854,776,000。

您是哪种购物商家运行不属于这些类型?

浮点数

其实你并不想要Float,原因很简单,它是基于floating-point technology, and you never use floating-point for money. Never use floating-point for any context where accuracy is important. Floating-point trades away accuracy for speed的执行力。通常,您的客户会关心钱。因此,您绝不会出于此类目的在 Java 中使用 floatFloatdoubleDouble 类型。此解决方法显然容易出现混淆和错误,因此需要仔细的文档和编码。

BigDecimal

在准确性很重要的情况下,例如金钱,请使用 BigDecimal。不是因为它可以处理大量数据,而是 因为它很准确。慢,但准确。

使用 BigDecimal 的建议仅适用于您拥有零星金额的情况,例如跟踪一美元上的便士。如果您只使用整数,则不需要 BigDecimal

小数额的整数解决方法

确实,在缺少 BigDecimal 等替代方案的语言中,浮点数问题的解决方法是将所有小数乘以整数,直到它们变成整数。例如,如果对一美元(美国)的便士进行簿记,则将所有金额乘以 100 以将整便士的计数保持为整数而不是小数美元的计数。

整数

至于在 Java 中使用整数,您有 multiple simple choices.

  • 对于 127 及以下的数字,使用 byteByte, using 8 bits
  • 对于 32,767 及以下的数字,使用 shortShort,使用 16 bits
  • 对于 2^31-1 及以下(约 20 亿)的数字,使用 intInteger,使用 32 bits.
  • 对于 2^63-1 和更少的数字(大约无数 gazillion),使用 longLong,使用 64 bits.
  • 对于更大的数字,使用 BigInteger

通常最好使用最小的整数类型,它可以轻松地适合您的当前值以及适合可预见的未来值。

32 位或 64 位类型是现代硬件的主要选择。您不必担心最小的类型,除非使用大量这些值,或者在内存上非常受限。对于大多数面向业务的应用程序,使用 BigInteger 都是过大的杀伤力。 (科学和工程应用程序可能是另一回事。)


另请参阅 JSR 354:货币和货币 API 库中的