繁体   English   中英

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

[英]What is the best way to store a money value in the database?

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

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

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

最近,我在 Sql 服务器中发现了一篇关于十进制与货币数据类型的文章,您可能会感兴趣:

金钱与小数

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

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

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

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

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

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

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

因此,在数据库中时,它将采用刚性 integer 形式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM