我需要在SQL 2008数据库中存储货币汇率数据。
我想将rate保留为数据库中的decimal
数据类型。
我不确定的一件事是要提供多少小数(例如十进制(18,?))。
因为,我将使用此服务作为来源:http://openexchangerates.org/latest.json。在那里,似乎使用的最小小数位数为“ 6 ”。
这是正确的数字,还是可能有超过 6 小数位的费率?
答案 0 :(得分:12)
我曾经参与过国际金融C#套餐,它必须支持多种货币,我们支持6位小数。我们有几位非常有经验的设计师告诉我们这就足够了。
答案 1 :(得分:5)
如今,为了支持XBT / VND的不太可能的汇率,您需要10到14个小数位
截至2017-11-20,
Schema::create('tbl_category', function (Blueprint $table) {
$table->integer('cat_id')->NOTNULL;
$table->string('cat_name',50);
$table->string('cat_detail', 100);
$table->string('cat_img', 50);
$table->integer('menu_id', 11)->NOTNULL;
$table->integer('parent_id', 11)->NOTNULL;
$table->timestamp('cat_update')->NOTNULL;
$table->timestamps();
});
答案 2 :(得分:0)
对此没有一个简单的答案。问题是您要存储什么:
我只知道带有2个小数位的货币,但是according to this doc from Oracle ISO标准规定货币中允许 3个小数位。 (我找不到Oracle在这里提到的ISO文档)。
有趣: SQL Server的数据类型为money
and smallmoney
,支持4个小数位。不知道他们是怎么想出来的,也许是由于四舍五入的问题(见下文)。
您可能要确保不会遇到四舍五入的问题,因此在文档总金额(例如发票)的“小额”中使用三个以上的小数位。
示例:
线 | 数量 | 价格 | 折扣 | 行金额 | 行金额四舍五入到小数点后第二位 |
---|---|---|---|---|---|
项目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美分的舍入差异。您可以使用其他数字玩此游戏,在这些数字中,您遇到的差异要超过小数点后三位。
我使用过的大多数系统使用不同的方法:
如何处理文档行中的舍入问题取决于您的应用程序设计。