我使用的十进制列储存的金钱价值观在一个数据库,并且今天我不知道精确度和规模使用。

由于据说char列的一个固定的宽度更有效率,我想同样的可能是真的小数列。是吗?

和什么样的精确度和规模的我应该使用?我想精24/8.是矫枉过正,没有足够的或好吗?


这是什么我决定要做:

  • 存储转换率(适当时)在交易表本身、作为一个漂浮
  • 商店的货币账户中的表
  • 交易量将是一个 DECIMAL(19,4)
  • 所有的计算使用的兑换率将会由我的应用程序所以我保持控制的四舍五入的问题

我不认为一个漂浮的兑换率是一个问题,因为它主要是作为参考,我将铸到小数点无论如何。

谢谢您的宝贵的投入。

有帮助吗?

解决方案

如果你是在寻找一个尺寸适合所有人,我建议 DECIMAL(19, 4) 是一个受欢迎的选择(一个快速的谷歌熊本)。我认为这来源于古老的VBA/Access/Jet货币的数据类型,是第一个固定点小型的语言; Decimal 只是在'1.0版'的风格(即不充分执行)中的维生素b6/VBA6/喷4.0.

该规则的经验 储存 固定点小数值储存至少多一个小数位比你实际上要求允许对于四舍五入。其中一个原因为映射老 Currency 类的前端 DECIMAL(19, 4) 类型的后端, Currency 表现出银行家的四舍五入的性质,而 DECIMAL(p, s) 圆形通过截断。

一个额外的小数位存储 DECIMAL 允许一个自定义的四舍五入的算法加以实施,而不是把供应商的默认(和银行家'四舍五入是令人担忧的,至少可以说,对于一个设计师的期望所有价值观结束在.5圆从零)。

是的, DECIMAL(24, 8) 听起来像矫枉过正的我。大多数货币的引述四个或五位小数。我知道的情况下,一个小规模的8个(或更多) 必需的,但这是一种'正常'的货币金额(说小数点后四位)已经按比例会,表示小数点精度应该相应减少(也考虑一个浮点类型在这样的情况)。没有人有那么多的钱现在需要的小数点精度的24:)

然而,不是一个尺寸适合所有人的方法,一些研究可以在序。问问你的设计师或领域专家有关会计规则可以适用:会计准则,欧盟,等等。我依稀记得一些欧盟国家内部转让的明确的规则四舍五入到五位小数,因此使用 DECIMAL(p, 6) 用于储存。会计师一般似乎赞成四位小数。


PS避免SQL服务器的 MONEY 数据类型,因为它具有严重问题的准确度时,四舍五入,除其他因素,如可移植性等。看看 亚伦伯特兰的博客.


Microsoft和语言的设计师选择了银行家的四舍五入,因为硬件设计者的选择它[引文?].它载于《研究所的电气和电子工程师(IEEE)的标准,例如。和硬件设计者的选择,因为数学家们喜欢它。看看 维基百科;套用:在1906年版的概率和理论上的错误,称这种'计算机的规则'("计算机"的意义的人类执行的计算).

其他提示

我们最近实施了一个系统,需要处理的价值在多种货币,转换成他们之间的,并推断出一些事情困难的方式。

从来没有使用浮点数钱

浮点运算的介绍不准确,可能不会被注意到,直到他们已经拧的东西了。所有数值应当保存作为整体或固定小数类型,如果你选择使用的一个固定的十进制的类型,然后确保你明白到底是什么类型的发动机罩下(即,不在内部使用的一整数或浮点类型)。

当你需要做的计算或转换:

  1. 转换值浮点
  2. 计算新的价值
  3. 轮的数量和换为一个整数

当转换一个浮点数回整数在第3步,不只是把它使用一个数学的功能,以圆它第一次。这通常会 round, 虽然在特殊情况下,它可能是 floorceil.知道其中的差别和仔细选择。

商店的类型数目与价值

这可能不是对你很重要,如果你只是处理一种货币,但它是重要的,我们在处理多种货币。我们使用了3个字符编码于一种货币,例如美元、英镑、日元、欧元,等等。

根据不同的情况,也可以是有用的存储:

  • 无论是数量是之前或之后的税务(和什么税率)
  • 数量是否导致的变换(而这是什么转换)

知道的准确界限的号码你处理

对于真正的价值,你想成为精确的最小单元的货币。这意味着你有没有值小于一分钱,一分钱、日元、芬等。不保存价值较高的精确度,没有任何理由。

在内部,你可以选择要处理的较小值,在这种情况下,这是一个 不同类型的货币价值.确保你的代码知道这是这并不让他们混在一起。避免使用浮点值甚至在这里。


加入所有这些规则合在一起,我们决定下列规则。在运行的代码,货币储存使用的一整数的最小单元。

class Currency {
   String code;       //  eg "USD"
   int value;         //  eg 2500
   boolean converted;
}

class Price {
   Currency grossValue;
   Currency netValue;
   Tax taxRate;
}

在数据库中,该数值储存作为一串在以下格式:

USD:2500

那商店的价值25.00美元。我们能够做的仅仅是因为代码,涉及货币不需要在数据库内层本身,所以所有数值可以转化为存的第一个。其他情况无疑将有助于其他解决方案。


和在的情况下,我没有说清楚早些时候, 不使用浮!

在处理金钱MySQL,使用十进制(的13.2)如果你知道精确的金钱价值或使用双重的,如果你只是想要一个快速的好的-足够近似值。因此,如果应用程序需要处理金钱的价值起到一万亿美元(或者欧元或英镑),那么本应该工作:

DECIMAL(13, 2)

或者,如果需要遵守 会计准则 然后使用:

DECIMAL(13, 4)

小数点后4位会给你的准确性存的世界上最小的货币子单元。你可以把它下一步如果你需要的小额支付(nanopayment?!) 准确性。

我太喜欢 DECIMAL 到DBMS特钱类型,你在安全保持这种逻辑在应用国际海事组织。另一种做法沿着同样的思路是简单地使用一个[长期]整数、格式成¤单元。亚基于人类的可读性(¤=货币符号)的应用程序的水平。

钱类型就SQL服务器有四位数字后的十进制。

从SQL Server2000书在线:

货币表示数据的正面或负面的的数额的金钱。在Microsoft SQL Server2000年,货币数据存储使用金钱和smallmoney的数据类型。货币数据可以存到一个准确的四位小数。使用的金钱的数据类型来存储的数值范围从-922,337,203,685,477.5808通过922,337,203,685,477.5807(需要8个字节储存值)。使用smallmoney数据类型来存储的数值范围从-214,748.3648通过214,748.3647(需要4个字节储存值)。如果有更多的小数位是必需的,使用十进制的数据类型来代替。

有时候你需要去至少比分和有国际货币,使用非常大的demoniations.例如,可能收取客户0.088美分,每笔交易。在我Oracle数据库所列被定义为数(20,4)

如果你要做任何种类的算术运算数据库(乘出费率等),则可能需要更多的精度比人们在这里所提出的建议,出于同样的原因,你不会想要使用任何小于一个双精度浮点值中应用的代码。

如果你使用IBM Informix动态服务器,你会有一个资金类型,这是一个小小的变异上的小数或数类型。它始终是一个固定点类型(而小数可能是一个浮点类型)。你可以指定一个规模从1到32、以及精度从0到32(默认为一个规模16和一个高精度为2)。所以,根据什么你需要的商店,您可以使用十进制的(16,2)-仍然足够大举行的美国联邦赤字,到距离最近占-或者你可以使用一个较小的范围内,或更小的地方。

我认为,对于很大一部分您或您的客户的要求应该决定什么样的精确度和规模使用。例如,对电子商务的网站我正在处理的钱在英镑的只是,我被要求保持它的到小数(6,2).

一个迟到的答案在这里,但是我用过的

DECIMAL(13,2)

这我正在思考应该允许高达99,999,999,999.99.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top