在Java编程语言中,哪种原始数据类型可用于保存货币或其他精确值?

时间:2016-01-06 07:51:26

标签: java

在Java编程语言中,哪种原始数据类型可用于保存货币或其他精确值? 以下是描述Java中不同基本数据类型的链接 - http://www.tutorialspoint.com/java/java_basic_datatypes.htm

4 个答案:

答案 0 :(得分:3)

根据您的目的,答案可以是“无”或long。在任何情况下,都不使用浮点类型作为货币值,因此不要使用floatdouble:它们以二进制形式存储值,而货币值通常在十进制,这意味着并非所有货币值都将正确存储。

出于某些目的,您可以使用long来存储货币值(存储分数)。但是,这会稍微限制值的大小。

通常,人们使用BigDecimal来存储货币值,但这不是原始类型(但它是Java标准库的一部分)。

答案 1 :(得分:2)

虽然许多人会告诉你不要使用double,但实际上这是大多数投资银行所做的。为什么?因为这实际上是最容易出错的数据类型之一。

为什么要使用double

  • 表示不是随机错误。
  • 对于没有出现高通胀的货币,双倍的精确度就足够了。例如美国国债(无论如何都是估计)可以表示为0.1美分的精确度。如果您的货币处于高通胀状态,请不要进行交易。
  • 使用long是一个选项,但您需要正确跟踪精度,否则您会不小心将数字乘以10x或100x。这比添加0.000000001美分要差得多。
  • 使用BigDecimal并不意味着你不必考虑舍入,但它确实很难检测到你有这样的错误。编码和运行速度较慢,而且更容易出错(因为它没有像C#decimal这样的语言支持),例如如果你看到0.3333333333333332它是一个错误但是0.33作为BigDecimal呢?看起来不错,但可能是1.00/3
  • 许多财务库都是用C或C ++编写的。这些都使用double,因为没有BigDecimal。很大一部分金融交易系统完全用C / C ++编写,他们也不会使用BigDecimal。 (他们可以使用long long但大多数人使用double

我认为每个人都同意的一件事是,除非你有数十亿这样的价值观,否则不要使用float。例如用于背部测试。它的精度很差,代码实际上稍微冗长。

答案 2 :(得分:1)

您可以使用Bigdecimal存储小数值。另请查找JODA money

  

Joda-Money提供简单的价值类型,代表货币和   钱。

您还可以look for the reason了解为什么不应该使用双或其他原始类型来存储货币值。

另请注意,Java提供了Currency class

  

代表货币。货币由ISO 4217标识   货币代码。访问ISO网站了解更多信息。班级   的设计使得永远不会有多个Currency实例   任何给定的货币。因此,没有公共构造函数。您   使用getInstance方法获取Currency实例。

答案 3 :(得分:1)

如果它必须是原始的,有两种策略:

  1. 使用long,手动缩放。
  2. 使用double,但请记住存储的值与实际值非常接近。通常,人们会忘记多近。它足够精确,可以将美国国债存入最近的分数。
  3. 当然,最好的解决方案是忘记"原语"要求并使用BigDecimal,它是为精确存储小数部分而设计的。