我需要在 SQL 2008 数据库中存储货币汇率数据。我想将 rate 作为decimal
数据库中的一种数据类型。
我不确定的一件事是要给出多少小数位(例如 decimal(18, ?))。
因为,我将使用此服务作为来源: http: //openexchangerates.org/latest.json。在那里,似乎使用的最高小数位数是“ 6 ”。
这是正确的数字,还是可能有超过6个小数位的费率?
我需要在 SQL 2008 数据库中存储货币汇率数据。我想将 rate 作为decimal
数据库中的一种数据类型。
我不确定的一件事是要给出多少小数位(例如 decimal(18, ?))。
因为,我将使用此服务作为来源: http: //openexchangerates.org/latest.json。在那里,似乎使用的最高小数位数是“ 6 ”。
这是正确的数字,还是可能有超过6个小数位的费率?
我曾经做过一个基于 C# 的国际金融包,它必须支持多种货币,我们支持 6 位小数。我们有几个非常有经验的设计师告诉我们这就足够了。
如今,为了支持不太可能的 XBT/VND 汇率,您需要 10 到 14 位小数
截至 2017 年 11 月 20 日,
1 XBT = 185,416,429.63 VND
1 VND = 0.00000000539327 XBT
对此没有一个简单的答案。问题是您要存储什么:
我只知道小数点后 2 位的货币,但根据 Oracle的这个文档,ISO 标准规定货币允许小数点后 3 位。(我找不到 Oracle 在这里提到的 ISO 文档)。
有趣: SQL Server 有一个数据类型money
,smallmoney
它支持 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 美分的四舍五入差异。您可以使用其他数字玩这个游戏,如果您遇到的差异超过小数点后三位。
我使用的大多数系统都使用不同的方法:
如何处理文档行中的舍入问题取决于您的应用程序设计。