我正在使用一个十进制列将货币值存储在数据库中,今天我想知道使用什么精度和小数位数。
由于据说固定宽度的char列效率更高,所以我想对于十进制列也是如此。是吗?
我应该使用什么精度和规模?我正在考虑精度24/8。那是矫kill过正,还不够还是可以?
这是我决定要做的:
DECIMAL(19,4)
我认为转换率的浮动不成问题,因为它主要用于参考,无论如何我都会将其转换为小数。
谢谢大家的宝贵意见。
如果您正在寻找一种千篇一律的功能,我建议您DECIMAL(19, 4)
选择一个流行的选择(Google很快就证实了这一点)。我认为这源自旧的VBA / Access / Jet Currency数据类型,它是该语言中的第一个定点十进制类型;Decimal
在VB6 / VBA6 / Jet 4.0中仅采用“版本1.0”样式(即未完全实现)。
固定点十进制值存储的经验法则是,比舍入所需的实际位数多存储至少一个小数位。Currency
将前端的旧类型映射到后端的DECIMAL(19, 4)
类型的原因之一是,Currency
银行家的天性表现为四舍五入,而DECIMAL(p, s)
截断则表现为四舍五入。
存储中额外的小数位可用于DECIMAL
实现自定义舍入算法,而不是采用供应商的默认值(而银行家的四舍五入令人震惊,至少对于设计师来说,期望所有以.5结尾的值都舍入为零)。 。
是的,DECIMAL(24, 8)
对我来说听起来太过分了。大多数货币都引用到小数点后四到五位。我知道需要十进制小数位数为8(或更高)的情况,但这是按比例分配了“正常”货币金额(例如,四个小数位)的情况,这意味着应该相应地降低小数精度(请考虑在这种情况下为浮点类型)。如今没有人需要十进制精度的24 :)
但是,可能需要按顺序进行一些研究,而不是一刀切。向您的设计者或领域专家询问可能适用的会计规则:GAAP,EU等。我隐约记得一些欧盟内部转移,其中包含明确的规则以四舍五入到小数点后五位,因此DECIMAL(p, 6)
用于存储。会计师通常倾向于小数点后四位。
PS避免使用SQL Server的MONEY
数据类型,因为它在取整时会存在严重的准确性问题,其中包括可移植性等其他注意事项。请参见Aaron Bertrand的博客。
微软和语言设计师选择银行家四舍五入是因为硬件设计师选择了它。例如,它包含在电气和电子工程师协会(IEEE)标准中。硬件设计师之所以选择它,是因为数学家更喜欢它。参见维基百科; 解释一下:1906年的《概率与错误理论》称其为“计算机规则”(“计算机”是指执行计算的人类)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句