Что представляет собой двойной сервер sql?
У меня есть несколько свойств в C#
, которые являются double
, и я хочу их хранить в таблице на SQL Server, но заметил, что нет типа double
, поэтому лучше всего использовать decimal
или float
?
Это сохранит значения широты и долготы, поэтому мне нужна самая точная точность.
Спасибо за ответы до сих пор.
Ответы
Ответ 1
float
Или, если вы хотите пойти в старой школе:
real
Вы также можете использовать float (53), но это означает то же самое, что и float.
("реальный" эквивалентен float (24), а не float/float (53).)
Десятичный (x, y) тип SQL Server предназначен для случаев, когда вам нужны точные десятичные числа, а не числа с плавающей запятой (которые могут быть приблизительными). Это отличается от "десятичного" типа данных С#, который больше похож на 128-битное число с плавающей запятой.
MSSQL float не обладает точно такой же точностью, как 64-битный двойной тип в .NET (небольшая разница в мантиссе IIRC), но он достаточно близко подходит для большинства применений.
Чтобы еще более запутать, "float" в С# является только 32-разрядным, поэтому в SQL он будет более эквивалентен типу real/float (24) в MSSQL, чем float/float (53).
В вашем конкретном случае использования... Все, что вам нужно, это 5 знаков после запятой, чтобы представить широту и долготу с точностью до одного метра, и вам нужно всего до трех цифр перед запятой для градусов. Float (24) или decimal (8,5) будут лучше всего соответствовать вашим потребностям в MSSQL, и использование float в С# достаточно хорошо, вам не нужно использовать double. На самом деле, ваши пользователи, вероятно, будут благодарить вас за округление до 5 десятичных знаков, а не за то, что у вас будет куча незначительных цифр, идущих для поездки.
Ответ 2
Кроме того, здесь является хорошим ответом для сопоставления типов SQL-CLR с полезной диаграммой.
Из этой публикации (David):
![enter image description here]()
Ответ 3
Ниже перечислены сопоставления типов данных CLR для SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Ответ 4
float - ближайший эквивалент.
Перечисление SqlDbType
Для широты/долготы, как указано выше.
Метр - это 1/40 000 000 широты, 1 секунда - около 30 метров. Float/double даст вам 15 значимых цифр. С некоторой быстрой и хитрой ментальной арифметикой... ошибки округления/аппроксимации будут примерно равны длине этой остановки заполнения → "."
Ответ 5
Как отмечали другие, float
- правильный ответ. Для получения дополнительной информации см. Документация Microsoft по сопоставлению данных SQL Server - CLR.
Ответ 6
Вы должны сопоставить его с FLOAT (53) - что LINQ to SQL делает.
Ответ 7
float
в SQL Server фактически имеет [править: почти] точность "double" (в смысле С#).
float
является синонимом float(53)
. 53 - биты мантиссы.
.NET double
использует 54 бита для мантиссы.
Ответ 8
В MSDN есть отличный поток, описывающий основное различие между FLOAT и DECIMAL. Короче говоря, Float является приблизительным и не может представлять некоторые значения.
Посмотрите на принятый ответ.
Ответ 9
Для SQL Sever:
Десятичный тип - 128-разрядный номер подписчика
Float - это 64-разрядный номер подписки.
Реальный ответ Float, я был неверным о десятичном значении.
Причина в том, что если вы используете десятичное число, вы никогда не будете заполнять 64-разрядный десятичный тип.
Хотя десятичное значение не даст вам ошибки, если вы попытаетесь использовать тип int.
Здесь - хорошая справочная таблица типов.
Ответ 10
@Achilles Отлично! Пришел сюда для двойного пребывания в TinyInt.
Вот частично выполненный случай переключения для преобразования между dataTable и SQL:
switch (columnDataTypeList[i])
{
case "System.String":
columnDataTypeList[i] = "VARCHAR(MAX)";
break;
case "System.Int32":
columnDataTypeList[i] = "INT";
break;
case "System.DateTime":
columnDataTypeList[i] = "DATE";
break;
case "System.Double":
columnDataTypeList[i] = "FLOAT";
break;
}
Строка может быть проблемой, не забудьте отредактировать ее в соответствии с вашими потребностями, но двойник должен работать, и это вопрос под рукой.
Ответ 11
Похоже, вы можете выбирать и выбирать. Если вы выберете float, вы можете потерять 11 цифр точности. Если это приемлемо, идите на это - очевидно, дизайнеры Linq считают это хорошим компромиссом.
Однако, если вашему приложению нужны эти дополнительные цифры, используйте десятичную. Десятичный (правильно введенный) является более точным, чем поплавок, в любом случае - беспорядочный перевод с базы 10 на базовую 2 и обратно.
Ответ 12
Нет ли уже сопоставлений в классах System.Data.Sql?
Смотрите: С#: эквиваленты типов данных SQL Server в .NET Framework.
Теперь сделайте мой поплавок...
Ответ 13
В случае, если это полезно, ниже приведена ссылка, на которую я обычно ссылаюсь (на этот раз я попал в эту ветку в первом Google!).
Он содержит информацию в дополнение к предыдущим опубликованным ссылкам, поскольку показывает процедуры и перечисления SqlDataReader (в дополнение к сравнениям типов .NET и SQL).
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
(и да плавают!)
Ответ 14
Float
представляет собой double
в SQL-сервере. Вы можете найти доказательства кодирования в С# в visual studio. Здесь я объявил Overtime
как Float
в SQL-сервере и в С#. Таким образом, я могу конвертировать
int diff=4;
attendance.OverTime = Convert.ToDouble(diff);
Здесь OverTime
объявлен как float type