在Java编程语言中,哪种原始数据类型可用于保存货币或其他精确值? 以下是描述Java中不同基本数据类型的链接 - http://www.tutorialspoint.com/java/java_basic_datatypes.htm
答案 0 :(得分:3)
根据您的目的,答案可以是“无”或long
。在任何情况下,都不使用浮点类型作为货币值,因此不要使用float
或double
:它们以二进制形式存储值,而货币值通常在十进制,这意味着并非所有货币值都将正确存储。
出于某些目的,您可以使用long
来存储货币值(存储分数)。但是,这会稍微限制值的大小。
通常,人们使用BigDecimal
来存储货币值,但这不是原始类型(但它是Java标准库的一部分)。
答案 1 :(得分:2)
虽然许多人会告诉你不要使用double
,但实际上这是大多数投资银行所做的。为什么?因为这实际上是最容易出错的数据类型之一。
为什么要使用double
long
是一个选项,但您需要正确跟踪精度,否则您会不小心将数字乘以10x或100x。这比添加0.000000001美分要差得多。0.3333333333333332
它是一个错误但是0.33
作为BigDecimal呢?看起来不错,但可能是1.00/3
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)
如果它必须是原始的,有两种策略:
long
,手动缩放。当然,最好的解决方案是忘记"原语"要求并使用BigDecimal,它是为精确存储小数部分而设计的。