我正在使用十进制列在数据库中存储货币值,今天我想知道使用什么精度和比例。
由于据说固定宽度的 char 列效率更高,我认为十进制列也是如此。是吗?
我应该使用什么精度和规模?我在想 24/8 精度。这是矫枉过正,不够还是可以?
这就是我决定做的事情:
DECIMAL(19,4)
我认为转换率的浮点数不是问题,因为它主要用于参考,无论如何我都会将其转换为小数。
谢谢大家的宝贵意见。
如果您正在寻找一刀切,我建议这DECIMAL(19, 4)是一个流行的选择(快速谷歌证实了这一点)。我认为这源于旧的 VBA/Access/Jet Currency 数据类型,是该语言中第一个定点十进制类型;Decimal仅在 VB6/VBA6/Jet 4.0 中以“1.0 版”样式出现(即未完全实现)。
DECIMAL(19, 4)
Decimal
存储 定点十进制值的经验法则是存储至少比实际需要的小数位允许舍入。Currency将前端的旧类型映射到后端的类型的原因之一DECIMAL(19, 4)是Currency表现出银行家的四舍五入性质,而DECIMAL(p, s)截断四舍五入。
Currency
DECIMAL(p, s)
存储中的额外小数位DECIMAL允许实现自定义舍入算法,而不是采用供应商的默认值(至少可以说,对于期望所有以 0.5 结尾的值从零舍入的设计师来说,银行家的舍入令人担忧) .
DECIMAL
是的,DECIMAL(24, 8)对我来说听起来有点矫枉过正。大多数货币的报价精确到小数点后四位或五位。我知道需要小数位数 8(或更多)的 情况 ,但这是按比例分配“正常”货币金额(例如小数点后四位)的情况,这意味着小数精度应相应降低(也考虑这种情况下的浮点类型)。现在没有人有那么多钱来要求小数精度为 24 :)
DECIMAL(24, 8)
然而,一些研究可能是有序的,而不是一刀切的方法。向您的设计师或领域专家询问可能适用的会计规则:GAAP、欧盟等。我模糊地回忆起一些欧盟国家内转移,其中明确规定四舍五入到小数点后五位,因此DECIMAL(p, 6)用于存储。会计师通常似乎偏爱小数点后四位。
DECIMAL(p, 6)
PS 避免使用 SQL Server 的MONEY数据类型,因为它在舍入时存在严重的准确性问题,以及可移植性等其他考虑因素。请参阅Aaron Bertrand 的博客。
MONEY
微软和语言设计师选择了银行家的四舍五入,因为硬件设计师选择了它[引文?]。例如,它被载入电气和电子工程师协会 (IEEE) 标准。硬件设计师之所以选择它,是因为数学家更喜欢它。见维基百科;释义:1906 年版的《概率与错误理论》将此称为“计算机规则”(“计算机”是指执行计算的人)。