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

Set an SqlDecimal variable to the max value it can store

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

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

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

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

要获得给定精度和小数位数的 SqlDecimal 的最大二进制表示,请使用:

SqlDecimal.Parse("".PadRight(precision-scale,'9')+"."+"".PadRight(scale,'9'));

例如十进制(18,6):

public static readonly SqlDecimal MaxDecimal18_6 = SqlDecimal.Parse("".PadRight(18-6,'9')+"."+"".PadRight(6,'9'));

为了加快启动速度,您可以在调试模式下查看 _maxDecimal18_6.Data 数组并将上一行转换为:

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

为了更好地理解精度+小数位数给出了最大位数。这些数字存储为 128 位二进制数中最多 38 位十进制数字(通过 Data 作为四 int 数组访问)。您应该注意到每个精度+小数位数都给出了不同的最大值,并且因为 128 位数字可能大于 (10^39)-1 = 999999 .... 38 次,所以不可能使用 new SqlDecimal(38,6,true, -1, -1, -1, -1); 来获得最高值(-1 signed 将所有位都设为 1),因为此初始值设定项高于最高十进制值。