java 中的大数据类型
Big datatype in java
我一直在处理一个应用程序。与购物业务有关。
有一个模型具有:
private Float count;
private Long price;
我想知道 count * price
的最佳 java 数据类型,因为 price
和 count
的数量巨大。
另外一方面在price
* count
操作时不会发生溢出。
对于巨大的值,有 BigDecimal 或 BigInteger 类。我将在您的案例中使用 BigDecimal。这个 类.
你永远不会溢出
JSR 354:货币与通货 API
作为解决方案,您可以考虑使用 JavaMoney.org 库 on GitHub. This library implements the JSR 354: Money and Currency API 规范的方法。
API的目标:
- 提供 API 用于处理和计算货币金额
- 定义类表示货币和货币金额,以及货币四舍五入
- 处理货币汇率
- 处理货币和货币金额的格式化和解析
如果您不想使用任何库,您当然应该使用 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.
Long
是 Long.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 中使用 float
、Float
、double
或 Double
类型。此解决方法显然容易出现混淆和错误,因此需要仔细的文档和编码。
BigDecimal
在准确性很重要的情况下,例如金钱,请使用 BigDecimal
。不是因为它可以处理大量数据,而是 因为它很准确。慢,但准确。
使用 BigDecimal
的建议仅适用于您拥有零星金额的情况,例如跟踪一美元上的便士。如果您只使用整数,则不需要 BigDecimal
。
小数额的整数解决方法
确实,在缺少 BigDecimal
等替代方案的语言中,浮点数问题的解决方法是将所有小数乘以整数,直到它们变成整数。例如,如果对一美元(美国)的便士进行簿记,则将所有金额乘以 100 以将整便士的计数保持为整数而不是小数美元的计数。
整数
至于在 Java 中使用整数,您有 multiple simple choices.
- 对于 127 及以下的数字,使用
byte
或 Byte
, using 8 bits。
- 对于 32,767 及以下的数字,使用
short
或 Short
,使用 16 bits。
- 对于 2^31-1 及以下(约 20 亿)的数字,使用
int
或 Integer
,使用 32 bits.
- 对于 2^63-1 和更少的数字(大约无数 gazillion),使用
long
或 Long
,使用 64 bits.
- 对于更大的数字,使用
BigInteger
。
通常最好使用最小的整数类型,它可以轻松地适合您的当前值以及适合可预见的未来值。
32 位或 64 位类型是现代硬件的主要选择。您不必担心最小的类型,除非使用大量这些值,或者在内存上非常受限。对于大多数面向业务的应用程序,使用 BigInteger
都是过大的杀伤力。 (科学和工程应用程序可能是另一回事。)
另请参阅 JSR 354:货币和货币 API 库中的 。
我一直在处理一个应用程序。与购物业务有关。
有一个模型具有:
private Float count;
private Long price;
我想知道 count * price
的最佳 java 数据类型,因为 price
和 count
的数量巨大。
另外一方面在price
* count
操作时不会发生溢出。
对于巨大的值,有 BigDecimal 或 BigInteger 类。我将在您的案例中使用 BigDecimal。这个 类.
你永远不会溢出JSR 354:货币与通货 API
作为解决方案,您可以考虑使用 JavaMoney.org 库 on GitHub. This library implements the JSR 354: Money and Currency API 规范的方法。
API的目标:
- 提供 API 用于处理和计算货币金额
- 定义类表示货币和货币金额,以及货币四舍五入
- 处理货币汇率
- 处理货币和货币金额的格式化和解析
如果您不想使用任何库,您当然应该使用 BigDecimal
。
最大值:
Float
isFloat.MAX_VALUE
, (2-2^23)*2^127, 类似于 3.40282346638528860e+38 或 340,282,346,638,528,860,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 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 中使用 float
、Float
、double
或 Double
类型。此解决方法显然容易出现混淆和错误,因此需要仔细的文档和编码。
BigDecimal
在准确性很重要的情况下,例如金钱,请使用 BigDecimal
。不是因为它可以处理大量数据,而是 因为它很准确。慢,但准确。
使用 BigDecimal
的建议仅适用于您拥有零星金额的情况,例如跟踪一美元上的便士。如果您只使用整数,则不需要 BigDecimal
。
小数额的整数解决方法
确实,在缺少 BigDecimal
等替代方案的语言中,浮点数问题的解决方法是将所有小数乘以整数,直到它们变成整数。例如,如果对一美元(美国)的便士进行簿记,则将所有金额乘以 100 以将整便士的计数保持为整数而不是小数美元的计数。
整数
至于在 Java 中使用整数,您有 multiple simple choices.
- 对于 127 及以下的数字,使用
byte
或Byte
, using 8 bits。 - 对于 32,767 及以下的数字,使用
short
或Short
,使用 16 bits。 - 对于 2^31-1 及以下(约 20 亿)的数字,使用
int
或Integer
,使用 32 bits. - 对于 2^63-1 和更少的数字(大约无数 gazillion),使用
long
或Long
,使用 64 bits. - 对于更大的数字,使用
BigInteger
。
通常最好使用最小的整数类型,它可以轻松地适合您的当前值以及适合可预见的未来值。
32 位或 64 位类型是现代硬件的主要选择。您不必担心最小的类型,除非使用大量这些值,或者在内存上非常受限。对于大多数面向业务的应用程序,使用 BigInteger
都是过大的杀伤力。 (科学和工程应用程序可能是另一回事。)
另请参阅 JSR 354:货币和货币 API 库中的