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

ams*_*ams 21 database-design currency

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

  1. 将钱存入美分的缺点是什么?
  2. 是否有特定的操作难以用钱作为美分?
  3. 存储为美分的货币是否适用于所有世界范围的货币,或者对不同的货币进行会计处理会成为一个巨大的混乱吗?
  4. 是否有一个很好的Java库可以用钱作为美分?

更新对于没有美分的货币,我们可以将问题概括为将货币存储为货币的最小次要单位,因此美元和其他等价货币的美分.

Mar*_*cin 6

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

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

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

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


azz*_*azz 3

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

\n\n

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

\n\n

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

\n\n

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

\n

  • 如果使用浮点数,请小心,因为错误很快就会发生。在处理金钱时,使用浮动通常被认为是一个非常糟糕的主意。 (7认同)
  • @DerFlatulator - 好吧 - 给一个 gommit 5 美元?给格罗特几英镑。那是多少莱石?谁能说清楚什么是“主要货币”? (2认同)