在SQL Server中存储百分比值的最佳方法应该是什么?


Answers:


48

十进制(p,s)和数字(p,s)

p(精度):

将存储的最大十进制数字总数(在小数点的左边和右边)


s(比例):

将存储在小数点右边的小数位数(-> s定义小数位数)


0 <= s <= p。

  • p ...总位数
  • s ...小数点右边的位数
  • ps ...小数点左边的位数

例:

CREATE TABLE dbo.MyTable
( MyDecimalColumn decimal(5,2)
 ,MyNumericColumn numeric(10,5)
);

INSERT INTO dbo.MyTable VALUES (123, 12345.12);

SELECT MyDecimalColumn, MyNumericColumn FROM dbo.MyTable;

结果:

MyDecimalColumn: 123.00 (p=5, s=2)

MyNumericColumn: 12345.12000 (p=10, s=5)

链接:msdn.microsoft.com


70

在99.9%的情况下应使用十进制(p,s)

百分比只是一个表示概念:10%仍然是0.1。

当表示为实数时,只需为最高期望值/期望的小数位选择精度和小数位数。对于<100%的值,您可以使用p = s,而只需根据小数位确定即可。

但是,如果确实需要存储100%或1,则需要p = s + 1。

然后,这最多允许9.xxxxxx或9xx.xxxx%,因此如果需要的话,我将添加一个检查约束以将其最大保持为1。


3
我需要一个介于%100-%0之间的值,并且它应该允许小数位(即%xx.xx),我使用的是decimal(5,4),它最适合我。
Shimmy Weitzhandler,2009年

我已经读过您的答案,但对于开发人员而言,使用语言变量时,在处理小数时会遇到精度方面的麻烦。例如,不能精确表示0.2,有些人建议在货币计算中避免使用小数(例如,在使用欧元的情况下,欧元使用美分进行计算)。groovyconsole.appspot.com/script/5078068011991040您对此有何建议?
Nico

1
@Nico:绝对不要在数据库中使用近似数字(例如FLOATDOUBLE)。您真的不需要它们,它们很容易引起问题。至于美分兑欧元:那是胡说八道。DECIMAL是精确的数据类型;因此,将123.45精确地存储为12345。它只会使人感到困惑,并可能导致错误的计算和意外的结果。
Thorsten Kettner

16

我同意,DECIMAL是您应存储此类数字的位置。但是为了使决策更容易,请将其存储为1的百分比,而不是100的百分比。这样一来,无论“整数”是多少,您都可以准确存储所需的小数位数。因此,如果要保留6位小数,请使用DECIMAL(9,8),对于23.3436435%,您可以存储0.23346435。将其更改为23.346435%是显示问题,而不是存储问题,并且大多数演示语言/报表编写者等都可以为您更改显示。


9

我认为十进制(p,s)应使用而s表示百分比能力。'p'可能为偶数,因为我们永远不需要一个以上的字节,因为该点左侧的每个数字都是一个百分数,所以p必须至少为s + 1,以便您能够最多可存储1000%。但是SQL不允许'p'小于s。

示例:28.2656579879%应该为十进制(13、12)并应存储00.282656579879 128.2656579879%应该为十进制(13、12)并应存储01.282656579879

28%应以0.28的形式存储在十进制(3,2)中128%应以1.28的形式存储在十进制(3,2)中

注意:如果您知道不会达到100%(即,您的值将始终小于使用小数(s,s)的100%,如果会,则使用小数(s + 1,s)。

等等


你想说什么 十进制(12,12)不能存储01.282656579879
GBN

为什么要问这个问题,然后立即给出详细答案……?
格雷格·比奇

感谢您的针锋相对的投票。但是,您真的不懂小数。为什么(s + 1,s)的值<100%?
gbn

@Greg:指出出什么问题了。Shimmy认为这是正确的。
gbn

1
我认为他是在传达您应该根据对范围(0-99.9、0-9999等)和精度的要求来设置p / s。
梅奥

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.