Что представляет собой double в sql server?
у меня есть несколько свойств в C#, которые double и я хочу сохранить их в таблице в SQL Server, но заметил, что нет double тип, так что лучше использовать decimal или float?
это будет хранить значения широты и долготы, поэтому мне нужна самая точная точность.
Спасибо за ответы до сих пор.
14 ответов:
floatили если вы хотите пойти старой школы:
realвы также можете использовать float(53), но это означает то же самое, что и float.
("real" эквивалентно float(24), а не float/float(53).)
The decimal (x,y) тип SQL Server предназначен для того, когда вы хотите точно десятичные числа, а не с плавающей запятой (которые могут быть приближениями). Это в отличие от типа данных c# "decimal", который больше похож на 128-битный плавающий номер точки.
MSSQL float нет ровно та же точность, что и 64-битный двойной введите .NET (небольшая разница в mantissa IIRC), но это достаточно близко подходит для большинства применений.
чтобы сделать вещи более запутанными, "float" в C# является только 32-разрядным, поэтому он был бы более эквивалентен в SQL реальному типу/float(24) в MSSQL, чем float/float(53).
в вашем конкретном случае использовать... Все вам нужно 5 мест после десятичной точки, чтобы представить широту и долготу в пределах около одного метра точности, и вам нужно только до трех цифр до десятичной точки для градусов. Float (24) или decimal(8,5) лучше всего подходят для ваших потребностей в MSSQL, и использование float в C# достаточно хорошо, вам не нужен double. На самом деле, ваши пользователи, вероятно, поблагодарят вас за округление до 5 знаков после запятой, а не за то, что у вас есть куча незначительных цифр.
вот сопоставления типов данных CLR с SQL Server:http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Как и большинство других отмечали,
floatЭто правильный ответ. Смотрите документация Microsoft по сопоставлению типов данных SQL Server - CLR для получения дополнительной информации.
float является ближайшим эквивалентом.
Edit:
для Lat / Long, как упоминалось OP.
метр составляет 1/40, 000, 000 широты, 1 секунда составляет около 30 метров. Float / double дают вам 15 значимых фигур. С некоторой быстрой и изворотливой умственной арифметикой... ошибки округления / аппроксимации будут примерно равны длине этой остановки заполнения ->"."
вы должны сопоставить его с FLOAT (53) - вот что LINQ to SQL делает.
floatв SQL Server на самом деле имеет [edit:почти] точность "двойного" (в смысле C#).
floatсинонимfloat(53). 53-это кусочки мантиссы..NET
doubleиспользует 54 бита для мантиссы.
есть отличный поток на MSDN описание основной разницы между FLOAT и DECIMAL. Короче говоря, Float является приблизительным и не может представлять некоторые значения.
посмотрите на принятый ответ.
для SQL Sever:
десятичный тип-128-битное число со знаком Float-это 64-разрядное число со знаком.
ответ Float, Я был неправ насчет десятичного числа.
причина в том, что если вы используете десятичное число, вы никогда не будете заполнять 64 бит десятичного типа.
хотя decimal не даст вам ошибку, если вы попытаетесь использовать тип int.
здесь это хорошая справочная диаграмма типов.
@Ахилл Отлично! Приехал сюда за дублем, остался за крохотной монетой.
вот частично сделанный случай переключения для преобразования между 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; }строка может быть проблемой обязательно отредактируйте ее в соответствии с вашими потребностями, но двойник должен работать, что является вопросом под рукой.
похоже, вы можете выбирать и выбирать. Если вы выберете float, вы можете потерять 11 цифр точности. Если это приемлемо, идите на это-по-видимому, дизайнеры Linq думали, что это хороший компромисс.
однако, если ваше приложение нуждается в этих дополнительных цифрах, используйте decimal. Десятичное число (реализовано правильно) является более точным, чем поплавок в любом случае-нет беспорядочного перевода с базы 10 на базу 2 и обратно.
в системе еще нет сопоставлений.Данные.Занятия по SQL?
посмотреть: C#: эквиваленты типов данных SQL Server в .NET Framework.
теперь, сделайте мой поплавок...
в случае, если это полезно, ниже приведена ссылка, на которую я обычно ссылаюсь (на этот раз я оказался в этой теме На первом Google!).
Он имеет дополнительную информацию к предыдущим ссылкам, опубликованным, поскольку он показывает процедуры SqlDataReader и перечисления (в дополнение к сопоставлениям типов .NET и SQL)
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
(и да поплавок!)
Floatпредставляет double inSQL server. Вы можете найти доказательство от кодирования вC#в visual studio. Здесь я объявил овертайм какFloatв SQL serverиC#. Таким образом, я могу конвертироватьint diff=4; attendance.OverTime = Convert.ToDouble(diff);здесь объявляется овертайм
float type

Comments