检查数值的精度和比例的有效方法是什么?

时间:2008-10-10 19:13:03

标签: c# sql-server .net-3.5

我正在编写一个例程,在将数据插入数据库之前验证数据,其中一个步骤是查看数值是否符合数字(x,y)SQL-Server类型的精度和比例。

我已经从SQL-Server获得了精度和规模,但是在C#中获得CLR值的精度和规模的最有效方法是什么,或者至少测试它是否适合给定的约束?

目前,我正在将CLR值转换为字符串,然后使用.IndexOf()查找小数点的位置。有更快的方法吗?

4 个答案:

答案 0 :(得分:8)

System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale( new SqlDecimal (1234.56789), 8, 2)

给出1234.67。它将截断小数位后的额外数字,并将抛出错误而不是尝试截断小数位前的数字(即ConvertToPrecScale(12344234,5,2)

答案 1 :(得分:4)

在不触发异常的情况下,您可以使用以下方法确定该值是否符合精度和比例约束。

private static bool IsValid(decimal value, byte precision, byte scale)
{
    var sqlDecimal = new SqlDecimal(value);

    var actualDigitsToLeftOfDecimal = sqlDecimal.Precision - sqlDecimal.Scale;

    var allowedDigitsToLeftOfDecimal = precision - scale;

    return 
        actualDigitsToLeftOfDecimal <= allowedDigitsToLeftOfDecimal && 
        sqlDecimal.Scale <= scale;
}

答案 2 :(得分:2)

这是一种基于数学的方法。

private static bool IsValidSqlDecimal(decimal value, int precision, int scale)
{
    var minOverflowValue = (decimal)Math.Pow(10, precision - scale) - (decimal)Math.Pow(10, -scale) / 2;
    return Math.Abs(value) < minOverflowValue;
}

这考虑了sql server如何进行舍入并防止溢出错误,即使我们超出了精度。例如:

DECLARE @value decimal(10,2)
SET @value = 99999999.99499 -- Works
SET @value = 99999999.995   -- Error

答案 3 :(得分:0)

你可以使用decimal.Truncate(val)来获取值的整数部分和decimal.Remainder(val,1)来获取小数点后的部分,然后检查每个部分是否符合你的约束(我是猜测这可能是一个简单的&gt;或&lt; check)