10

我需要在 SQL 2008 数据库中存储货币汇率数据。我想将 rate 作为decimal数据库中的一种数据类型。

我不确定的一件事是要给出多少小数位例如 decimal(18, ?))。

因为,我将使用此服务作为来源: http: //openexchangerates.org/latest.json。在那里,似乎使用的最高小数位数是“ 6 ”。

这是正确的数字,还是可能有超过6个小数位的费率?

4

3 回答 3

16

我曾经做过一个基于 C# 的国际金融包,它必须支持多种货币,我们支持 6 位小数。我们有几个非常有经验的设计师告诉我们这就足够了。

于 2012-05-08T19:45:41.507 回答
9

如今,为了支持不太可能的 XBT/VND 汇率,您需要 10 到 14 位小数

截至 2017 年 11 月 20 日,

1 XBT = 185,416,429.63 VND
1 VND = 0.00000000539327 XBT
于 2017-11-21T02:46:53.570 回答
0

对此没有一个简单的答案。问题是您要存储什么:

  • 它是发票的最终货币金额吗?
  • 还是可能是单据行的行金额(例如发票行的行金额)?

最终货币金额

我只知道小数点后 2 位的货币,但根据 Oracle的这个文档,ISO 标准规定货币允许小数点后 3 位。(我找不到 Oracle 在这里提到的 ISO 文档)。

有趣: SQL Server 有一个数据类型moneysmallmoney它支持 4 位小数。不知道他们是怎么想出来的,可能是因为四舍五入的问题(见下文)。

单据行的行数

您可能希望确保不会遇到四舍五入问题,因此使用超过 3 个小数位来表示文档总金额(例如发票)的“子金额”。

例子:

线 数量 价格 折扣 行金额 行金额四舍五入到小数点后 2 位
项目 A 5 79.99 3% 387.9515 387.95
B项 2 56.12 3% 108.8728 108.87
项目 C 1 12.19 3% 11.8243 11.82
全部的 508.65 508.64

当我们将行数四舍五入到小数点后两位时,我们最终会有 1 美分的四舍五入差异。您可以使用其他数字玩这个游戏,如果您遇到的差异超过小数点后三位。

我使用的大多数系统都使用不同的方法:

  • 在行金额中使用5 个或更多小数位。小数点后 5 位,如果这些四舍五入问题应该解决。我看到 ERP 系统有 10 个小数位,但我认为这更像是一个糟糕的应用程序设计。
  • 将行中的“强制”四舍五入为最大货币金额。小数位。当您想在发票中打印“行金额”并且您不想制作四舍五入的行金额与总金额不匹配的打印发票时,这是有道理的
  • 使其可以为应用程序配置应使用多少小数位。
  • 在文档中添加“粗略”行以对四舍五入进行打折,以防四舍五入问题对客户不利。
  • 当出现舍入问题时警告应用程序用户并询问系统应如何处理它们

如何处理文档行中的舍入问题取决于您的应用程序设计。

于 2020-12-09T10:12:48.533 回答