gpt4 book ai didi

sql - 将钱存储在小数列中 - 什么精度和比例?

转载 作者:太空狗 更新时间:2023-10-30 01:36:52 24 4
gpt4 key购买 nike

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

由于假定固定宽度的 char 列更有效,我认为 decimal 列也是如此。是吗?

我应该使用什么精度和比例?我在想全天候 24/8 的精确度。这是矫枉过正、不够还是还可以?


这是我决定要做的:

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

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

感谢大家的宝贵意见。

最佳答案

如果您正在寻找一刀切的方法,我建议 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's blog .


Microsoft 和语言设计师之所以选择银行家舍入,是因为硬件设计师选择了它 [引文?]。例如,它包含在电气和电子工程师协会 (IEEE) 标准中。硬件设计师之所以选择它,是因为数学家更喜欢它。参见 Wikipedia ;换句话说:1906 年版的概率论和错误理论将此称为“计算机规则”(“计算机”是指执行计算的人)。

关于sql - 将钱存储在小数列中 - 什么精度和比例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com