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

31

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

7个回答

45

十进制和货币应该非常可靠。从我因继承的应用程序而痛苦的个人经验中,我可以向您保证的是不要使用浮点数!


2
为什么不行?使用浮点数时遇到了什么问题? - Matt Hamilton
2
他的应用程序可能总共达到了几十万个数字,并且已经用完了位数。 - Chris S
24
浮点数在进行大量计算时会导致非常微小的舍入误差,尤其是对于金融应用程序,这会导致数字不平衡。 - Rad
2
值得注意的是,尽管您的数据库可能支持使用 DECIMAL 进行精确计算,但您的编程语言可能不支持。例如,PHP 将使用浮点数并破坏一切。在这种情况下,您可能希望使用整数。 - Stephen Melrose

14

我一直使用Decimal,从未使用过MONEY。

最近,我发现了一篇关于Sql服务器中decimal与money数据类型的文章,您可能会觉得很有趣:

Money vs Decimal

同时,似乎当您对其执行计算时,money数据类型并不总是产生准确的结果:点击这里

我之前也用过一个INT字段,将金额以分为单位进行存储(欧分 / 美分)。


1
请问您能详细说明一下如何表示100/3、10/3和1/3等数值吗? - NoChance

11

我想这取决于精度和尺度。如果我没记错的话,money 是四位小数。如果这样可以的话,money 就能表达您的意图。如果您想要更多的控制,就使用一个特定的精度和比例来使用 decimal


4
这取决于您的应用程序!!! 我们在金融服务行业工作,通常认为价格在小数点后要精确到5位数字,当然,当您以3.12345便士/美分购买几百万时,这是一个重要的金额。 一些应用程序将提供自己的SQL类型来处理此类情况。
另一方面,这可能并不必要。 <幽默> 承包商费率似乎总是四舍五入到最近的100英镑,但目前在当前信贷紧缩环境中似乎是最接近25英镑。 </幽默>

2

不要根据可用数据类型来调整你的思路。相反,先分析你的需求,然后再看哪种数据类型最适合。 考虑到存储浮点数二进制版本的架构的限制,Float 是任何时候都是最差的选择。 货币是一个标准单位,并且肯定会有更多的支持来处理与货币相关的操作。 在使用十进制时,你将不得不处理每一个细节,但你知道只有你在处理十进制类型,因此不会有其他两种数据类型可能带来的惊喜。


1

对于某些数据(如货币)你不希望出现任何近似或由于浮点值而发生的更改,你必须确保该数据从未“漂浮”,它必须在小数点两侧都是严格的。


一种简单的方法是将其转换为整数类型的值,并确保在检索值时,小数点放置在适当的位置,这样就可以安全地进行操作。


例如:


1. 将$240.10存入数据库。


2. 将其转换为纯粹的整数形式:24010(你知道它只是小数点的移位)。


3. 将其恢复到适当的十进制状态。将小数点放在右侧的第2个位置。 $240.10


因此,在数据库中,它将以严格的整数形式存在。


1

使用十进制并使用比您认为需要更多的小数位,以便计算正确。在计算中,货币不总是返回正确的结果。在任何情况下都不要使用浮点或实数,因为它们是不精确的数据类型,可能会导致计算错误(特别是随着计算变得更加复杂)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接