在数据库中存储货币价值的最佳方式是啥?
Posted
技术标签:
【中文标题】在数据库中存储货币价值的最佳方式是啥?【英文标题】:What is the best way to store a money value in the database?在数据库中存储货币价值的最佳方式是什么? 【发布时间】:2010-10-11 17:01:33 【问题描述】:我需要在数据库中存储几个与货币相关的字段,但我不确定在 money 和 decimal 之间使用哪种数据类型。
【问题讨论】:
【参考方案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
因此,在数据库中时,它将是一个刚性整数形式。
【讨论】:
以上是关于在数据库中存储货币价值的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章