在十进制列中存钱-精度和小数位数是多少?

伊万

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

由于据说固定宽度的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Postgres中数字数据类型的精度和小数位数是多少?

数学确定十进制值的精度和小数位数

查询DECIMAL列的精度和小数位数

SQL Server 为非常大的数字操作保留十进制小数位数和精度

固定小数位在Java中的双精度和十进制的幂

MySQL-如何使用存储的精度/小数位数转换为十进制?

Laravel 4.2迁移-更改小数精度和小数位数而无需删除列

在Python中根据给定的最大位数和小数位数创建最大可能的十进制数

如何在ALTER TABLE中设置精度和小数位数

无法理解 DBMS 中数字数据类型的精度和小数位数

如何解释数据库中数字的精度和小数位数?

双精度(Java)中的小数位数

如何创建与(p,s)精度和小数位数相匹配的正则表达式,例如SQL十进制类型?

计算bash shell中十进制数中的小数位数

Angular 2中的十进制管道-仅逗号,无小数位数

Java-十进制Format.parse返回具有指定小数位数的双精度值

在不考虑区域性的情况下,在十进制值中查找小数位数

存储具有不同小数位数的十进制数的最佳方法

微风-保存十进制类型的小数位数错误?

将一列转换为小数并指定其小数位数和精度而不会出现算术溢出错误?

乘数值(32,9)列时的SQL Server精度/小数位数

限制GWT中的小数位数?

R中删除的小数位数

在熊猫中处理小数位数

小数精度和小数位数

.netcore asp-for十进制失去小数位

将小数位加到十进制值

对PHP中的特定小数位取整十进制数

Angular 2 中的十进制管道 - 没有小数位而不舍入