gpt4 book ai didi

c# - 将 SqlDecimal 转换为 Decimal 时出现 OverflowException

转载 作者:行者123 更新时间:2023-12-02 11:17:05 24 4
gpt4 key购买 nike

在我们的实际应用程序中,我们在尝试转换 SqlDecimal 时遇到 OverflowException System.Decimal 的值为 99。抛出异常是因为 SqlDecimal 的精度高于 System.Decimal 的精度。

这是重现该问题的测试:

[Test]
public void SqlDecimalToDecimalOverflowTest()
{
// in our real application d1 & d2 are loaded from a database; both are declared as DECIMAL(28, 5)
// for test purposes I recreate identical SqlDecimal objects here:
var d1 = new SqlDecimal(28, 5, true, 9900000, 0, 0, 0); // Debugger shows {99.00000}
var d2 = new SqlDecimal(28, 5, true, 100000, 0, 0, 0); // Debugger shows {1.00000}

var d3 = d1.Value / d2; // Debugger shows d1.Value as {99}, d1.Value is of type decimal (not SqlDecimal)
var exception = d3.Value; // Debugger shows d3 as {99.0000000000000000000000000000000}
}

屏幕截图:

Debugging a unit test

问题是:
将此类 SqlDecimal 对象转换为 Decimal 的最快方法是什么?

前段时间我写了这个辅助方法:

public static SqlDecimal RecreateWithMinPrecScale(this SqlDecimal value)
{
string s = value.Scale > 0 ? value.ToString().TrimEnd('0') : value.ToString();
int delimiterIndex = s.IndexOf(".");
int precision = s.Length - (delimiterIndex >= 0 ? 1 : 0) - (s.StartsWith("-") ? 1 : 0);
int scale = delimiterIndex >= 0 ? s.Length - 1 - delimiterIndex : 0;
return SqlDecimal.ConvertToPrecScale(value, precision, scale);
}

所以我可以写

var ok = d3.RecreateWithMinPrecScale().Value; // no exception

但显然这是一种缓慢且低效的方法,我们需要进行数十亿次此类计算。

请让我们不要讨论为什么我们使用 SqlDecimal 类而不仅仅是 System.Decimal(这是一个金融应用程序,我相信以前我们需要支持很长的数字(无论是大的还是精确的),据说 28- 29 位 System.Decimal 可能不够)。

最佳答案

除法运算后,您应该恢复 d3 中的精度和小数位数属性值:

var d3 = d1.Value / d2;
d3 = SqlDecimal.ConvertToPrecScale(d3, 28, 5);

关于c# - 将 SqlDecimal 转换为 Decimal 时出现 OverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com