小编典典

将钱存储在小数列中 - 什么精度和规模?

all

我正在使用十进制列在数据库中存储货币值,今天我想知道使用什么精度和比例。

由于据说固定宽度的 char 列效率更高,我认为十进制列也是如此。是吗?

我应该使用什么精度和规模?我在想 24/8 精度。这是矫枉过正,不够还是可以?


这就是我决定做的事情:

  • 将转换率(如果适用)存储在交易表本身中,作为浮点数
  • 将货币存储在帐户表中
  • 交易金额将为DECIMAL(19,4)
  • 所有使用转换率的计算都将由我的应用程序处理,因此我可以控制舍入问题

我认为转换率的浮点数不是问题,因为它主要用于参考,无论如何我都会将其转换为小数。

谢谢大家的宝贵意见。


阅读 78

收藏
2022-07-28

共1个答案

小编典典

如果您正在寻找一刀切,我建议这DECIMAL(19, 4)是一个流行的选择(快速谷歌证实了这一点)。我认为这源于旧的 VBA/Access/Jet
Currency 数据类型,是该语言中第一个定点十进制类型;Decimal仅在 VB6/VBA6/Jet 4.0 中以“1.0
版”样式出现(即未完全实现)。

存储 定点十进制值的经验法则是存储至少比实际需要的小数位允许舍入。Currency将前端的旧类型映射到后端的类型的原因之一DECIMAL(19, 4)Currency表现出银行家的四舍五入性质,而DECIMAL(p, s)截断四舍五入。

存储中的额外小数位DECIMAL允许实现自定义舍入算法,而不是采用供应商的默认值(至少可以说,对于期望所有以 0.5
结尾的值从零舍入的设计师来说,银行家的舍入令人担忧) .

是的,DECIMAL(24, 8)对我来说听起来有点矫枉过正。大多数货币的报价精确到小数点后四位或五位。我知道需要小数位数 8(或更多)的 情况
,但这是按比例分配“正常”货币金额(例如小数点后四位)的情况,这意味着小数精度应相应降低(也考虑这种情况下的浮点类型)。现在没有人有那么多钱来要求小数精度为
24 :)

然而,一些研究可能是有序的,而不是一刀切的方法。向您的设计师或领域专家询问可能适用的会计规则:GAAP、欧盟等。我模糊地回忆起一些欧盟国家内转移,其中明确规定四舍五入到小数点后五位,因此DECIMAL(p, 6)用于存储。会计师通常似乎偏爱小数点后四位。


PS 避免使用 SQL Server 的MONEY数据类型,因为它在舍入时存在严重的准确性问题,以及可移植性等其他考虑因素。请参阅Aaron
Bertrand 的博客


微软和语言设计师选择了银行家的四舍五入,因为硬件设计师选择了它[引文?]。例如,它被载入电气和电子工程师协会 (IEEE)
标准。硬件设计师之所以选择它,是因为数学家更喜欢它。见维基百科;释义:1906
年版的《概率与错误理论》将此称为“计算机规则”(“计算机”是指执行计算的人)。

2022-07-28