将 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),因为此初始值设定项高于最高十进制值。
在某些情况下,我必须在.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),因为此初始值设定项高于最高十进制值。