Что представляет собой double в sql server?

у меня есть несколько свойств в C#, которые double и я хочу сохранить их в таблице в SQL Server, но заметил, что нет double тип, так что лучше использовать decimal или float?

это будет хранить значения широты и долготы, поэтому мне нужна самая точная точность.

Спасибо за ответы до сих пор.

14 ответов


float

или если вы хотите пойти старой школы:

real

вы также можете использовать float (53), но это означает то же самое, что и float.

("реальный" эквивалентен float(24), а не float/float(53).)

на decimal (x,y) тип SQL Server для Когда вы хотите точно десятичные числа, а не с плавающей запятой (которые могут быть приближениями). Это в отличие от типа данных c# "decimal", который больше похож на 128-битный плавающий номер точки.

MSSQL float нет ровно та же точность, что и 64-битный двойной введите .NET (небольшая разница в mantissa IIRC), но это достаточно близко для большинства применений.

чтобы сделать вещи более запутанными, "float" в C#-это только 32-бит, поэтому он был бы более эквивалентен в SQL типу real/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


и здесь - хороший ответ для сопоставления типов SQL-CLR с полезной диаграммой.

с этого поста (by Дэвид): enter image description here


как большинство других отметили,float Это правильный ответ. См.документация Microsoft по сопоставлению типов данных SQL Server - CLR для получения дополнительной информации.


float является ближайшим эквивалентом.

Перечисление SqlDbType

Edit:

для Lat / Long, как упоминалось OP.

метр 1/40, 000, 000 широты, 1 секунда около 30 метров. Float / double дают вам 15 значимых цифр. С помощью быстрой и хитрой арифметики... ошибки округления / аппроксимации будут примерно равны длине этой остановки заполнения ->"."


вы должны сопоставить его с FLOAT (53) - вот что LINQ to SQL делает.


float в SQL Server фактически имеет [edit:almost] точность "double" (в смысле C#).

float синоним float(53). 53-это кусочки мантиссы.

.NET double использует 54 бита для мантиссы.


есть отличный поток на MSDN описание основной разницы между FLOAT и DECIMAL. Короче говоря, Float является приблизительным и не может представлять некоторые значения.

посмотрите на принятый ответ.


для SQL Sever:

Decimal тип 128 бит подписанное число Float-это 64-битное число со знаком.

ответ Float, Я был неправ насчет decimal.

причина в том, что если вы используете десятичный, вы никогда не будете заполнять 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. Decimal (реализован правильно) является более точным, чем float в любом случае-нет беспорядочного перевода с базы 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 в SQL server. Вы можете найти доказательство из кода в C# в visual studio. Здесь я объявил овертайм как Float in SQL server и C#. Таким образом я могу преобразовать

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

здесь объявлен овертайм float type