如何防止C#端的SQL四舍五入decimal(18,4)输出

lin*_*a22 6 c# sql-server decimal rounding

我在存储过程中进行计算并传递输出参数。它在 SQL 端执行得很好。

但 C# 会decimal(18,4)通过自动舍入来检索 type 的输出值,如果低于 0.5,则自动舍入为 0;如果高于 0.5,则自动舍入为 1。

我需要decimal(18,4)精确的输出。

如何防止decimal(18,4)输出值被四舍五入?

C#

double sonuc=0;

SqlCommand cmd = new SqlCommand("findHBK", Connection.Con);
cmd.CommandType = CommandType.StoredProcedure;            

cmd.Parameters.AddWithValue("@yaFark", yaFark);
cmd.Parameters.AddWithValue("@yaTaban", yaTaban);

cmd.Parameters.Add("@sonuc", SqlDbType.Decimal).Direction = ParameterDirection.Output;               

if (cmd.Connection.State != ConnectionState.Open)
{
    cmd.Connection.Open();
}

cmd.ExecuteNonQuery();

sonuc = Convert.ToDouble(cmd.Parameters["@sonuc"].Value);
Run Code Online (Sandbox Code Playgroud)

SQL(存储过程的一部分)

ALTER PROCEDURE [dbo].[findHBK]
    (@yaTaban DECIMAL(18, 2),
     @yaFark DECIMAL(18, 2),
     @sonuc DECIMAL(18, 4) OUTPUT)
AS
BEGIN 
    DECLARE @minhbk DECIMAL(18, 4), 
            @maxhbk DECIMAL(18, 4), 
            @hbkFark DECIMAL(18, 4)

    IF (@yaTaban BETWEEN 2000 AND 5000)
    BEGIN
        SET @maxhbk = (SELECT MAX(HBK) FROM TBL_MDHB 
                       WHERE YapiAlani BETWEEN @yaTaban AND @yaTaban + 200)
        SET @minhbk = (SELECT MIN(HBK) FROM TBL_MDHB
                       WHERE YapiAlani BETWEEN @yaTaban AND @yaTaban + 200)
        -- SET @sonuc = @maxhbk - (((@maxhbk - @minhbk) * @yaFark) / 200);
        SET @sonuc = 0.3292

        SELECT @sonuc
    END 
    SELECT @sonuc OUT
END
Run Code Online (Sandbox Code Playgroud)

Ron*_*tel 7

请参考下面的代码。

请设置您需要返回的SqlParameter的Precision和Scale属性。它将完美地工作。

        cmd.Parameters["@sonuc"].Precision = 18;
        cmd.Parameters["@sonuc"].Scale = 4;
Run Code Online (Sandbox Code Playgroud)

在 SqlCommand 中添加参数后设置此属性。

这会对你有帮助的。

谢谢 。