我需要在数据库中存储几个与货币相关的字段,但是我不确定使用 money 和 decimal 之间应该选择哪种数据类型。
十进制和货币应该非常可靠。从我因继承的应用程序而痛苦的个人经验中,我可以向您保证的是不要使用浮点数!
我一直使用Decimal,从未使用过MONEY。
最近,我发现了一篇关于Sql服务器中decimal与money数据类型的文章,您可能会觉得很有趣:
同时,似乎当您对其执行计算时,money数据类型并不总是产生准确的结果:点击这里
我之前也用过一个INT字段,将金额以分为单位进行存储(欧分 / 美分)。
我想这取决于精度和尺度。如果我没记错的话,money
是四位小数。如果这样可以的话,money
就能表达您的意图。如果您想要更多的控制,就使用一个特定的精度和比例来使用 decimal
。
不要根据可用数据类型来调整你的思路。相反,先分析你的需求,然后再看哪种数据类型最适合。 考虑到存储浮点数二进制版本的架构的限制,Float 是任何时候都是最差的选择。 货币是一个标准单位,并且肯定会有更多的支持来处理与货币相关的操作。 在使用十进制时,你将不得不处理每一个细节,但你知道只有你在处理十进制类型,因此不会有其他两种数据类型可能带来的惊喜。
对于某些数据(如货币)你不希望出现任何近似或由于浮点值而发生的更改,你必须确保该数据从未“漂浮”,它必须在小数点两侧都是严格的。
一种简单的方法是将其转换为整数类型的值,并确保在检索值时,小数点放置在适当的位置,这样就可以安全地进行操作。
例如:
1. 将$240.10存入数据库。
2. 将其转换为纯粹的整数形式:24010(你知道它只是小数点的移位)。
3. 将其恢复到适当的十进制状态。将小数点放在右侧的第2个位置。 $240.10
因此,在数据库中,它将以严格的整数形式存在。
使用十进制并使用比您认为需要更多的小数位,以便计算正确。在计算中,货币不总是返回正确的结果。在任何情况下都不要使用浮点或实数,因为它们是不精确的数据类型,可能会导致计算错误(特别是随着计算变得更加复杂)。