29

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

4

7 回答 7

42

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

于 2009-03-06T08:37:15.627 回答
14

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

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

金钱与小数

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

我过去所做的就是使用一个 INT 字段,并将金额存储在美分(欧元/美元)中。

于 2009-03-06T08:35:22.573 回答
11

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

于 2009-03-06T08:31:20.540 回答
4

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

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

于 2009-03-06T09:18:22.687 回答
2

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

于 2012-09-17T14:56:14.647 回答
1

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

于 2009-03-06T19:03:28.570 回答
1

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

因此,在数据库中时,它将采用严格的整数形式。

于 2013-10-01T12:26:45.560 回答