![](/img/trans.png)
[英]What is the best way to store byte array in SQL database using NHibernate?
[英]What is the best way to store a money value in the database?
我需要在数据库中存储几个与货币相关的字段,但我不确定在货币和小数之间使用哪种数据类型。
十进制和金钱应该是相当可靠的。 我可以向你保证(来自继承应用程序的痛苦的个人经验)是不要使用浮动!
我想这归结为精度和规模。 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.