提问者:小点点

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


我注意到一些金融api的像条api信用卡处理要求金额作为美分传递,这似乎是一个很好的简化,它让我想知道为什么我不做同样的无处不在在我的应用程序我目前使用数据库NUMERIC无限长度与Postgres和BigDecimal在我的Java代码,但我被简单的存储钱作为美分的诱惑。

  1. 把钱存为美分有什么坏处?
  2. 有没有具体的操作,是钱如分难做的?
  3. 存储为美分的货币是否适用于所有世界范围内的货币,或者不同货币的会计处理是否会成为一个巨大的混乱,如果有其他特殊情况?
  4. 有没有一个好的java图书馆可以把钱当美分用?

更新对于没有美分的货币,我们可以将这个问题概括为将货币存储为货币的最小次要单位,所以美分代表美元,其他货币的等价物是什么。


共3个答案

匿名用户

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

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

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

所以,总的来说,最好既使用最小单位作为面额,又使用BigDecimal来处理小数部分,如果它们可以出现的话。不要使用IEEE浮点数,因为它们不能正确地表示所有的十进制数。这将导致各种错误,让人不安。

匿名用户

  1. 把钱存为美分有什么坏处?

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

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

在应用程序中使用真实货币并支持多种货币可能需要您将资金存储在100美分中,以支持像CLF小数点后4位或BHD小数点后3位这样的货币。请参阅ISO-4217。

据我所知没有。你在这样的图书馆里寻找什么样的支持?

匿名用户

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

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

对于有美分的货币,进行计算可能通常很简单,但很多时候你将不得不转换为美元(或非美元货币的主要货币),因为这是汇率的基础。

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