如果您正在寻找一种千篇一律的产品,我建议您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的博客。
微软和语言设计师选择银行家四舍五入是因为硬件设计师选择了[citation?]。例如,它包含在电气和电子工程师协会(IEEE)标准中。硬件设计师之所以选择它,是因为数学家更喜欢它。参见维基百科 ; 解释一下:1906年的《概率与错误理论》称此为“计算机规则”(“计算机”是指执行计算的人类)。