Как предотвратить вывод SQL с округлением десятичной (18,4) запятой на стороне c #

#c# #sql-server #decimal #rounding

#c# #sql-сервер #десятичный #округление

Вопрос:

Я выполняю вычисления в хранимой процедуре и передаю выходной параметр. Он отлично работает при выполнении на стороне SQL.

Но C # извлекает выходное значение типа decimal(18,4) путем автоматического округления, если оно меньше 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);
  

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
  

Комментарии:

1. где объявлена эта переменная sonuc и почему вы не объявляете ее как double по сравнению с использованием Convert.ToDouble функции

2. Какое значение cmd.Parameters["@sonuc"].Value перед приведением к удвоению? Не могли бы вы установить точку останова и посмотреть?

3. Я обновил свой вопрос

4. Правильно ли значение @sonuc при выполнении хранимой процедуры?

5. @Win спрашивал вас: что происходит, когда вы устанавливаете точку останова в своем коде C # для этой строки sonuc = Convert.ToDouble(cmd.Parameters["@sonuc"].Value) . Проверьте значение параметра @sonuc — действительно ли результат «0,3292»?

Ответ №1:

Пожалуйста, обратитесь к приведенному ниже коду.

Пожалуйста, установите свойство точности и масштаба SqlParameter, которое вам нужно вернуть. Он будет работать отлично.

         cmd.Parameters["@sonuc"].Precision = 18;
        cmd.Parameters["@sonuc"].Scale = 4;
  

Установите это свойство после добавления параметра в SqlCommand.

Это будет полезно для вас.

Спасибо.

Комментарии:

1. Я не хочу округлять вывод до 0 или 1. Мне нужно предотвратить округление и получить фактическое десятичное значение через 4 цифры после нуля. (например, так: 0.4567)