可能的重复:
用 Java 表示货币价值
哪种 java 类型适合处理价格价值?请告诉我为什么?
我不知道这只是一个问题:)
我只知道这种类型一定是“安全的”。因为如果我们创建商店应用程序或类似的想法。
附言。我需要最佳实践
以及它如何出现在数据库中?
可能的重复:
用 Java 表示货币价值
哪种 java 类型适合处理价格价值?请告诉我为什么?
我不知道这只是一个问题:)
我只知道这种类型一定是“安全的”。因为如果我们创建商店应用程序或类似的想法。
附言。我需要最佳实践
以及它如何出现在数据库中?
处理货币时应该使用BigDecimal 。Java 的本机浮点类型存在与其他语言相同的精度问题,因为某些小数不能准确地表示为浮点数。即使它不是特定于 java 的,这是一篇很好的文章,它描述了将十进制值表示为浮点数的复杂性。
通常,应用程序中的瞬态值应始终使用 BigDecimal,仅在必须时转换为浮点数(用于持久性或向用户显示数据等)。
您关心的最小分母的整数(或长整数)(美元和欧元的美分)
这是因为计算机上的浮点对于十进制值本质上是不准确的(0.1+0.2 != 0.3)
您只需要在 UI 中的美分和主要美元之间进行转换,而域以美分计算所有内容
就个人而言,我会使用BigDecimal
(我的公司也是如此!)。由于浮点值在系统中的存储方式,我会考虑float
或double
提出不好的建议,并且可能会丢失精度(在处理资金时您当然不希望出现这种情况)。
如果您正在构建金融系统,我建议您创建或使用自己的 Java 类来表示货币金额。
至于用于保存货币金额的数据类型,long 或 BigDecimal。
这是一个示例Money 类,它显示了处理货币金额时所需的方法类型。
如果您对结果double
进行合理的舍入,效果会非常好,不仅是最快的,而且是最容易编写的。这可以毫无错误地代表高达 70 万亿美元的资金。不要使用float
,因为这最多只能代表大约 10,000 美元而没有错误。
如果您不知道使用什么合理的舍入,BigDecimal
或者long
美分可能是更好的选择。
您需要使用BigDecimal类。