C# 将SqlDecimal变量设置为它可以存储的最大值

C# 将SqlDecimal变量设置为它可以存储的最大值,c#,.net,decimal,C#,.net,Decimal,在某种情况下,我必须在.net代码中将十进制变量的值设置为非常高的值,因此我使用decimal.MaxValue。不幸的是,变量的值将保存到十进制(18,6)字段的DB中,当这种情况发生时,我显然会出现算术溢出错误 我不想将变量值硬编码为99999999999.9999999,所以我想知道是否有办法将SqlDecimal实例设置为它能处理的最大值,然后从中获取十进制值。 例如,我可以像下面这样实例化一个SqlDecimal: SqlDecimal sqldec = new SqlDecimal(

在某种情况下,我必须在.net代码中将十进制变量的值设置为非常高的值,因此我使用decimal.MaxValue。不幸的是,变量的值将保存到十进制(18,6)字段的DB中,当这种情况发生时,我显然会出现算术溢出错误

我不想将变量值硬编码为99999999999.9999999,所以我想知道是否有办法将SqlDecimal实例设置为它能处理的最大值,然后从中获取十进制值。 例如,我可以像下面这样实例化一个SqlDecimal:

SqlDecimal sqldec = new SqlDecimal(18,6,true, new int[]{0});

但我不知道是否可以将其设置为可存储在此实例中的最大值,而无需硬编码到上述值。

要获得给定精度和比例的SqlDecimal的最大二进制表示形式,请使用:

SqlDecimal.Parse("".PadRight(precision-scale,'9')+"."+"".PadRight(scale,'9'));
例如,对于十进制(18,6):

为了加快引导速度,您可以在调试模式下查看_maxDecimal18_6.Data array,并将前一行转换为:

public static readonly SqlDecimal MaxDecimal18_6 = new SqlDecimal(18, 6, true, -1486618625, 232830643, 0, 0);

为了更好地理解精度+刻度,请给出最大位数。这些数字存储为128位二进制数中最多38位十进制数字(通过数据作为四整数数组访问)。您应该注意到,每个精度+刻度都会给出一个不同的最大值,因为128位数字可能大于(10^39)-1=999999。。。。38次,无法使用
newsqldecimal(38,6,true,-1,-1,-1)
要获取最高值(-1有符号表示所有位都为1),因为此初始值设定项高于最高十进制值。

与Int、Double和其他数字类型一样,存在MaxValue属性。使用它。MaxValue属性不适用于实例。最好不要硬编码99999999999999999.9999999,因为它高于
十进制(18,6)
可以存储的值。18是小数点两侧可容纳的总位数。@Alex,SqlDecimal的最大可用值高于my DB表中可存储的值,该表有一个小数点(18,6)
public static readonly SqlDecimal MaxDecimal18_6 = new SqlDecimal(18, 6, true, -1486618625, 232830643, 0, 0);