24

我注意到一些金融 api,比如用于信用卡处理的条带 api,要求金额以美分形式传递,这似乎是一个很好的简化,这让我想知道为什么我现在不在我的应用程序中的所有地方都做同样的事情在我的 Java 代码中使用带有 Postgres 和 BigDecimal 的数据库 NUMERIC 无限长度,但我对将钱存储为美分的简单性很感兴趣。

  1. 将钱存储为美分有什么缺点。
  2. 有没有具体的操作是用钱来分钱很难做到的?
  3. 以美分存储的钱是否适用于所有世界范围内的货币,或者如果其他特殊情况,不同货币的核算是否会变得一团糟?
  4. 有没有一个很好的 java 库来处理钱作为美分?

更新对于没有美分的货币,我们可以将问题概括为将钱存储为货币的最小次要单位,因此美分代表美元,以及其他货币的等值物。

4

3 回答 3

6

缺点是你不能代表小数单位。如果您正在执行利息计算等,这是一个问题。但是,如果您进行“真钱”交易,这个问题就会消失。

货币是否为非小数并不重要——只要有一个最小单位,您就可以用它来表示任何其他金额。如果相关,您可能需要更聪明地以人类可读的格式显示,但这是一个单独的问题。

事实上,使用最小单位可能会简化执行转换,因为您可以计算出每个货币对的最小单位之间的转换率。当然,一旦您进入转换率,您最终将需要再次使用 BigDecimal(或类似的)。

因此,总而言之,最好同时使用最小单位作为您的面额,并使用 BigDecimal 来处理可能出现的小数部分。不要使用 IEEE 浮点数,因为它们不能正确表示所有十进制数。这将导致令人不安的错误。

于 2013-09-21T16:59:06.090 回答
2
  1. 将钱存储为美分有什么缺点。

没有那么多。将钱存储为美分可以简化计算并使其精确。正如多次提到的,永远不要在计算中将你的钱表示为浮动。

  1. 有没有具体的操作是用钱来分钱很难做到的?

您最终需要向用户展示金额。然后需要根据特定货币的格式对值进行格式化。

  1. 以美分存储的钱是否适用于所有世界范围内的货币,或者如果其他特殊情况,不同货币的核算是否会变得一团糟?

使用真实货币并在应用程序中支持多种货币可能需要您以 100 美分存储货币,以支持具有 4 个小数位的 CLF 或具有 3 个小数位的 BHD 等货币。参见ISO-4217

  1. 有没有一个很好的 java 库来处理钱作为美分?

不是我知道的。您在这样的图书馆中寻找什么样的支持?

于 2016-01-19T08:31:34.490 回答
1

贸易通常以美元计算(发布时 1 澳元 = 0.94 美元)。说 100 澳分 = 94 美分是微不足道的,但是有许多货币不存在美分。美分的主要优点是您可以将值存储为整数,而美元必须存储为浮点或定点十进制值。

以美分(作为整数)存储货币值的一个缺点是可能会出现舍入错误。例如 20 澳分 = 18.8 美分。

对于有美分的货币,计算起来通常很简单,但很多时候你必须转换成美元(或主要货币,对于非美元货币),因为这就是汇率的基础离开。

就个人而言,我总是在细分上使用主要货币,它们更容易使用,更不容易出现舍入错误,并且更容易阅读(150.50 美元比 15050 美分更容易阅读。)

于 2013-09-21T16:31:45.797 回答