19

可能的重复:
用 Java 表示货币价值

哪种 java 类型适合处理价格价值?请告诉我为什么?

我不知道这只是一个问题:)

我只知道这种类型一定是“安全的”。因为如果我们创建商店应用程序或类似的想法。

附言。我需要最佳实践

以及它如何出现在数据库中?

4

6 回答 6

26

处理货币时应该使用BigDecimal 。Java 的本机浮点类型存在与其他语言相同的精度问题,因为某些小数不能准确地表示为浮点数。即使它不是特定于 java 的,这是一篇很好的文章,它描述了将十进制值表示为浮点数的复杂性。

通常,应用程序中的瞬态值应始终使用 BigDecimal,仅在必须时转换为浮点数(用于持久性或向用户显示数据等)。

于 2012-09-19T14:12:59.387 回答
7

您关心的最小分母的整数(或长整数)(美元和欧元的美分)

这是因为计算机上的浮点对于十进制值本质上是不准确的(0.1+0.2 != 0.3)

您只需要在 UI 中的美分和主要美元之间进行转换,而域以美分计算所有内容

于 2012-09-19T14:14:43.880 回答
4

就个人而言,我会使用BigDecimal(我的公司也是如此!)。由于浮点值在系统中的存储方式,我会考虑floatdouble提出不好的建议,并且可能会丢失精度(在处理资金时您当然不希望出现这种情况)。

于 2012-09-19T14:14:19.260 回答
3

如果您正在构建金融系统,我建议您创建或使用自己的 Java 类来表示货币金额。

至于用于保存货币金额的数据类型,long 或 BigDecimal。

这是一个示例Money 类,它显示了处理货币金额时所需的方法类型。

于 2012-09-19T14:17:07.590 回答
1

如果您对结果double进行合理的舍入,效果会非常好,不仅是最快的,而且是最容易编写的。这可以毫无错误地代表高达 70 万亿美元的资金。不要使用float,因为这最多只能代表大约 10,000 美元而没有错误。

如果您不知道使用什么合理的舍入,BigDecimal或者long美分可能是更好的选择。

于 2012-09-19T14:18:35.797 回答
0

您需要使用BigDecimal类。

于 2012-09-19T14:13:43.240 回答