将货币价值存储为美分/次要单位的缺点是什么?

时间:2013-09-21 16:11:49

标签: database-design currency

我注意到一些财务api就像信用卡处理的条带api要求金额作为美分传递,这似乎是一个很好的简化,它让我想知道为什么我不在我的应用程序中的任何地方做同样的事情我目前在我的Java代码中使用数据库NUMERIC无限长度与Postgres和BigDecimal,但我很容易将钱存入简单。

  1. 将钱存入美分的缺点是什么?
  2. 是否有特定的操作难以用钱作为美分?
  3. 以美分存储的货币是否适用于所有全球货币或是 如果不同的货币会计成为一个巨大的混乱 其他特殊情况?
  4. 是否有一个很好的java库可供使用 钱如仙?
  5. 更新对于没有美分的货币,我们可以将问题概括为存储货币作为货币的最小次要单位,因此美元和其他等价货币的美分。

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

  1. 将钱存入美分有什么缺点。
  2. 不是那么多。将钱存储为美分简化了计算并使其精确。如同提到的那样,在计算中永远不要将你的钱代表浮动。

    1. 是否有特定的操作难以用钱作为美分?
    2. 您最终需要向用户提供金额。然后需要根据特定货币的格式设置值。

      1. 存储为美分的货币是否适用于所有世界范围的货币,或者对不同的货币进行核算会成为一个巨大的混乱,如果是其他特殊情况?
      2. 在应用程序中使用真实货币并支持多种货币可能需要您以100美分的价格存储货币,以支持CLF等4位小数或BHD(小数点后3位)等货币。请参阅ISO-4217

        1. 有没有一个好的java库可以用钱作为美分?
        2. 不是我知道的。您在这样的图书馆中寻找什么样的支持?

答案 2 :(得分:0)

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

以美分(以整数形式)存储货币值的缺点是可能发生舍入错误。例如20澳大利亚美分= 18.8美分。

对于有美分的货币,计算可能通常很简单,但很多时候你必须转换成美元(或主要货币,非美元货币),因为这就是交易所价格基于。

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