我需要在数据库中存储几个与货币相关的字段,但我不确定在货币和小数之间使用哪种数据类型。
7 回答
十进制和金钱应该是相当可靠的。我可以向你保证(来自继承应用程序的痛苦的个人经验)是不要使用浮动!
我想这归结为精度和规模。IIRC,money
是 4dp。如果没问题,就money
表达了你的意图。如果您想要更多控制,请使用decimal
特定的精度和比例。
这取决于您的应用程序!!!我在金融服务行业工作,我们通常认为价格在小数点后 5 位非常重要,当然,当您以 3.12345 便士/美分的价格购买数百万美元时,这是一笔不小的数目。一些应用程序会提供自己的 sql 类型来处理这个问题。
另一方面,这可能没有必要。<幽默> 承包商费率似乎总是四舍五入到最接近的 100 英镑,但在当前的信贷紧缩中,目前似乎接近 25 英镑。</幽默>
不要根据可用的数据类型调整你的想法。相反,分析您的需求,然后查看最适合的数据类型。考虑到架构在存储二进制版本的浮点数方面的限制,浮点数在任何时候都是最糟糕的选择。钱是一个标准单位,在处理钱相关的操作上肯定会有更多的支持。在十进制的情况下,您必须处理所有内容,但您知道只有您自己在处理十进制类型,因此对于其他两种数据类型,您可能不会感到意外。
使用小数并使用比您认为需要的更多的小数位,以便计算正确。金钱并不总是在计算中返回正确的结果。在任何情况下都不要使用 float 或 real,因为它们是不精确的数据类型,并且可能导致计算错误(尤其是当它们变得更加复杂时)。
对于某些数据(如货币),您不希望因浮点值而产生近似值或变化,您必须确保数据永远不会“浮动”,它必须在小数点两侧都是刚性的。
一种简单的安全方法是,通过将其转换为 INTEGER 数据类型来赋值,并确保在检索值时,小数点放置在正确的位置。
例如
1. 将 240.10 美元存入数据库。
2.将其转换为纯整数形式:24010(您知道它只是小数的移位)。
3. 将其恢复为正确的十进制状态。将小数点放在右起 2 位。240.10 美元
因此,在数据库中时,它将采用严格的整数形式。