在数据库中存储货币价值的最佳方式是啥?

Posted

技术标签:

【中文标题】在数据库中存储货币价值的最佳方式是啥?【英文标题】:What is the best way to store a money value in the database?在数据库中存储货币价值的最佳方式是什么? 【发布时间】:2010-10-11 17:01:33 【问题描述】:

我需要在数据库中存储几个与货币相关的字段,但我不确定在 moneydecimal 之间使用哪种数据类型。

【问题讨论】:

【参考方案1】:

十进制和金钱应该是相当可靠的。我可以向您保证(从继承应用程序的痛苦个人经验)是不要使用浮动!

【讨论】:

为什么不呢?你在使用 float 时遇到了什么问题? 他的申请可能总共有 200,000 的数量并且用完了数字 浮点数会导致非常细微的舍入误差,尤其是在使用大量数字进行计算时。对于金融应用,这会导致数字不平衡 尽管您的数据库可能支持 DECIMAL 的准确性,但您的编程语言可能不支持,这毫无价值。例如,php 将使用 float 并破坏一切。在这种情况下,您可能想要使用 INTEGER。【参考方案2】:

我总是使用十进制;以前从未使用过 MONEY。

最近,我发现一篇关于 Sql server 中小数与货币数据类型的文章,您可能会感兴趣:

Money vs Decimal

当您使用货币数据类型进行计算时,它似乎并不总能得到准确的结果:click

我过去所做的同样是使用 INT 字段,并将金额存储为美分(欧元/美元)。

【讨论】:

能否详细说明我们如何表示 100/3、10/3 和 1/3 等?【参考方案3】:

我想这归结为精度和规模。 IIRC,money 是 4dp。如果没问题,money 会表达您的意图。如果您想要更多控制,请使用具有特定精度和比例的decimal

【讨论】:

【参考方案4】:

这取决于您的应用程序!!! 我在金融服务行业工作,我们通常认为价格在小数点后 5 位非常重要,当然,当您以 3.12345 便士/美分的价格购买数百万美元时,这是一笔可观的金额。 一些应用程序会提供自己的 sql 类型来处理这个问题。

另一方面,这可能不是必需的。 承包商费率似乎总是四舍五入到最接近的 100 英镑,但在当前的信贷紧缩情况下,目前似乎接近 25 英镑。 幽默>

【讨论】:

【参考方案5】:

不要根据可用的数据类型调整你的想法。相反,分析您的需求,然后查看最适合的数据类型。 考虑到架构在存储二进制版本的浮点数方面的限制,浮点数在任何时候都是最糟糕的选择。 钱是一个标准单位,在处理钱相关的操作上肯定会有更多的支持。 如果是十进制,您将不得不处理所有的事情,但您知道只有您自己在处理十进制类型,因此对于其他两种数据类型,您可能会感到惊讶。

【讨论】:

【参考方案6】:

使用小数并使用比您认为需要的更多的小数位,以便计算正确。金钱并不总是在计算中返回正确的结果。在任何情况下都不要使用 float 或 real,因为它们是不精确的数据类型,可能会导致计算错误(尤其是当它们变得更加复杂时)。

【讨论】:

【参考方案7】:

对于某些数据(如货币),您不希望因浮点值而产生近似值或变化,您必须确保数据永远不会“浮动”,它必须在小数点两侧保持刚性。 一种简单的安全方法是,通过将其转换为 INTEGER 数据类型来赋值,并确保在检索值时,小数点放置在正确的位置。 例如 1. 将 240.10 美元存入数据库。 2. 将其转换为纯整数形式:24010(你知道它只是小数的移位)。 3. 将其恢复为正确的十进制状态。将小数点放在右起 2 位。 $240.10

因此,在数据库中时,它将是一个刚性整数形式。

【讨论】:

以上是关于在数据库中存储货币价值的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 存储货币符号的最佳方式?

在 Redshift 中存储事件数据的最佳方式是啥?

在多个站点之间共享数据库数据的最佳方式是啥?

在 iOS 应用程序中本地存储数据的最佳方式是啥? [复制]

在核心数据文档中存储文档特定设置的最佳方式是啥?

在源代码管理中存储 MySQL 数据库的最佳方式是啥?