Что представляет собой двойной сервер 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

Ответ 4

float - ближайший эквивалент.

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

Для широты/долготы, как указано выше.

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

Ответ 7

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

float является синонимом float(53). 53 - биты мантиссы.

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

Ответ 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 и обратно.

Ответ 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