#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)