在货币数据库中存储货币价值的最佳方法是什么?

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

十进制和金钱应该是非常可靠的。 我可以向你保证(来自inheritance应用程序的痛苦个人经验)是不要使用浮动!

我总是使用十进制; 从来没有用过MONEY。

最近,我在Sql server中发现了一篇关于十进制与货币数据类型的文章,你可能会觉得有趣:

金钱与十进制

当您使用它执行计算时,money数据类型似乎并不总能产生准确的结果: 单击

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

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

这取决于你的应用程序! 我在金融服务部门工作,我们通常认为价格在点之后的5位小数位上显着,当然当你以3.12345便士/美分购买几百万时,这是一笔很大的金额。 一些应用程序将提供自己的sql类型来处理这个问题。

另一方面,这可能没有必要。 <幽默>承包商费率似乎总是四舍五入到最接近的100英镑,但目前在目前的信贷危机中似乎最接近25英镑。

不要根据可用的数据类型调整您的想法。 而是分析您的需求,然后查看哪种数据类型最合适。 考虑到存储浮点数二进制版本的体系结构的限制,Float随时是最糟糕的选择。 资金是一个标准单位,肯定会有更多的支持来处理与资金相关的业务。 在十进制的情况下,你将不得不处理每一个和所有事情,但你知道它只是你处理一个十进制类型,因此没有你可能会得到其他两种数据类型的惊喜。

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

对于某些数据(如金钱),您不希望由于浮点值而导致近似或更改,您必须确保数据永远不会“浮动”,它必须在小数点的两边都是刚性的。
一种简单的安全方法是,通过将其转换为INTEGER数据类型来确定值,并确保在您重新读取值时,小数点位于适当的位置。
例如
1.将240.10美元存入数据库。
2.将其转换为纯积分forms:24010(你知道它只是十进制的移位)。
3.将其恢复为正确的小数状态。 将小数点放在右边的2个位置。 $ 240.10

因此,在数据库中,它将采用刚性整数forms。