我需要在数据库中存储几个与钱相关的字段,但我不确定在 money 和 decimal 之间使用哪种数据类型。
答案 0 :(得分:40)
十进制和金钱应该非常可靠。我可以向你保证(来自继承应用程序的痛苦个人经验)不要使用float!
答案 1 :(得分:14)
我总是使用十进制;从来没有使用过MONEY。
最近,我在Sql server中发现了一篇关于十进制与货币数据类型的文章,您可能会感兴趣:
使用它进行计算时,money数据类型似乎并不总能产生准确的结果:click
我过去所做的是使用INT字段,并以美分(欧元/美元)存储金额。
答案 2 :(得分:11)
我想这取决于精度和规模。 IIRC,money
是4dp。如果可以,money
表达您的意图。如果您想要更多控制,请使用具有特定精度和比例的decimal
。
答案 3 :(得分:4)
这取决于你的申请! 我在金融服务部门工作,我们通常认为价格在点之后的5位小数位显着,当然,当你以3.12345便士/美分的价格购买几百万时,这是一个很大的数额。 一些应用程序将提供自己的sql类型来处理这个问题。
另一方面,这可能没有必要。 <幽默和GT; 承包商费率似乎总是四舍五入到最接近的100英镑,但目前在目前的信贷危机中似乎是最接近的25英镑。 < /幽默>
答案 4 :(得分:2)
请勿根据可用的数据类型调整您的想法。而是分析您的需求,然后查看哪种数据类型最合适。 考虑到存储浮点数二进制版本的体系结构的限制,Float随时是最糟糕的选择。 资金是一个标准单位,肯定会有更多的支持来处理与资金相关的业务。 在十进制的情况下,你将不得不处理每一个和所有的事情,但你知道它只是你处理一个十进制类型,因此没有你可能会得到其他两种数据类型的惊喜。
答案 5 :(得分:1)
使用小数并使用比您认为需要更多的小数位数,以便计算正确。金钱不会在计算中返回正确的结果。在任何情况下都不要使用float或real,因为这些是不精确的数据类型并且可能导致计算错误(特别是当它们变得更复杂时)。
答案 6 :(得分:1)
对于某些数据(如金钱),如果您不希望由于浮点值而导致近似或更改,则必须确保数据永远不会“浮动”,它必须在小数点的两边都是刚性的。
一种简单的安全方法是,通过将其转换为INTEGER数据类型来确定值,并确保在您检索该值时,小数点位于适当的位置。
例如
1.将240.10美元存入数据库
2.将其转换为纯积分形式:24010(你知道它只是十进制的移位)
3.将其恢复为正确的小数状态。将小数点放在右边的2个位置。 $ 240.10
因此,在数据库中,它将采用刚性整数形式。