Satpal Lakhera Ответов: 1

Как хранить точные значения в базе данных SQL


у меня есть таблица sql как:

создание таблицы поперечной упругости
(
Поплавок поперечной упругости,
)


сохранение значений в нем с помощью хранимой процедуры как:

создать proc Usp_saveCrossElasticity (@CrossElasticityValue float)
как
начать
обновить набор Кросселастичности CrossElasticityValue=@CrossElasticityValue
конец

создать proc Usp_GetCrossElasticity
как
начать
выберите CrossElasticityValue из CrossElasticity
конец


теперь я пытаюсь сохранить значение как 0.512, но оно сохраняется как 0.51200001023
но я просто хочу точно 0,512.! как это сделать?
(использование SQL server 2012 adv и visual studio 2013)

Что я уже пробовал:

доступ как :

охраняемых недействительными btnCrossElasticitySave_Click(объект отправителя, EventArgs в электронной)
{
if (txtCrossElasticityValueNew.Текст == "")
{ Функции MessageBox.Show ("пожалуйста, заполните правильные значения.."); }
ещё
{
пробовать
{
против.Закрывать();
против.Открыть();
SqlCommand cmd1 = new SqlCommand ("Usp_saveCrossElasticityValue", con);
cmd1. CommandType = CommandType.Хранимая процедура;

cmd1.Параметры.Add(new SqlParameter ("@CrossElasticityValue", SqlDbType.Поплавок));
cmd1. Parameters ["@CrossElasticityValue"].Значение = Преобразовать.ToSingle(txtCrossElasticityValueNew. Text);

int RowCount = cmd1.Метод executenonquery();
if (RowCount > 0)
{
Ящик для сообщений.Show ("Сохранено Успешно..!!");
}
ещё
{
Ящик для сообщений.Шоу ("Что-То Пошло Не Так...!");
}
}
поймать (исключение бывший)
{
Ящик для сообщений.Шоу (напр.Метод toString());
}

}

}

[no name]

Вопрос в том, почему. Переменная, которую вы представляете, не может быть оценена с точностью, которую вы ищете. Таким образом, ваша забота полностью иллюзорна. Что плохого в поплавке, поскольку все ваши вычисления будут использовать поплавки? Возможно, вместо того, чтобы сосредотачиваться на этом, лучше понять анализ ошибок: http://www.owlnet.rice.edu/~labgroup/pdf/Error_analysis. pdf

Satpal Lakhera

tnx.. я понял..!

1 Ответов

Рейтинг:
11

Dave Kreskowiak

Тип данных float в SQL Server является приближением значения, а не точным значением. Он не может хранить точное значение для каждого числа в своем диапазоне.

Подумайте об этом. Компьютеры имеют ограниченное пространство для хранения числа, обычно всего 8 байт или меньше. Как вы представляете бесконечный диапазон чисел с бесконечной точностью в конечном пространстве? Подсказка: нельзя.

Вы должны изменить тип столбца на что-то более подходящее. Посмотрите на диаграмму на эта страница[^] и вы найдете все типы данных, поддерживаемые SQL Server 2012, а также их диапазоны значений, точность и то, является ли это точное представление точным. Вы должны выбрать тип, который соответствует вашим ожидаемым значениям. Обратите внимание, что вы должны торговать диапазоном для точности и точного представления.

Десятичная система является наиболее гибкой, но будьте осторожны с ней. Представление и диапазон, которые вы получаете в базе данных, автоматически не означают, что вы получаете тот же диапазон и точность в своем коде.


Satpal Lakhera

да, для значения = 5,6
Float may хранит приблизительные значения [as its of approx type] = 5.60000000002013
но
decimal (m,n) будет хранить m точек перед decimal и
n пинт после десятичной дроби
десятичная дробь (20,5) = 5.60000

но
decimal ("десятичное число без параметра") будет хранить
приблизительное значение ведьмы не имеет точек после десятичной дроби.
десятичная дробь = 6
спасибо