Что представляет собой двойной в sql сервере? - PullRequest
303 голосов
/ 31 июля 2009

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

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

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

Ответы [ 13 ]

357 голосов
/ 31 июля 2009
float

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

real

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

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

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

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

Чтобы запутать, "float" в C # является только 32-битным, поэтому в SQL он будет более эквивалентен типу real / float (24) в MSSQL, чем float / float (53).

В вашем конкретном случае использования ... Все, что вам нужно, это 5 знаков после запятой, чтобы представить широту и долготу с точностью до одного метра, и вам нужно всего до трех цифр перед запятой для градусов. Float (24) или decimal (8,5) будут лучше всего соответствовать вашим потребностям в MSSQL, и использование float в C # достаточно хорошо, вам не нужно использовать double. Фактически, ваши пользователи, вероятно, будут благодарить вас за округление до 5 знаков после запятой, а не за то, что у вас будет куча несущественных цифр.

47 голосов
/ 20 июля 2015

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

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

14 голосов
/ 31 июля 2009

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

14 голосов
/ 31 июля 2009

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

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

Редактировать:

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

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

9 голосов
/ 31 июля 2009

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

7 голосов
/ 31 июля 2009

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

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

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

5 голосов
/ 31 июля 2009
5 голосов
/ 31 июля 2009

Для сервера SQL:

Десятичный тип - 128-битное число со знаком Число с плавающей запятой - 64-битное число со знаком.

Реальный ответ - Число с плавающей запятой , я ошибся насчет десятичного числа.

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

Хотя десятичная дробь не выдаст ошибку, если вы попытаетесь использовать тип int.

Здесь - хорошая справочная таблица типов.

3 голосов
/ 27 февраля 2014

@ Ахиллес Отлично! Приехал сюда на двоих, остался на 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;
}

Строка может быть проблемой, не забудьте отредактировать ее в соответствии с вашими потребностями, но двойной должен работать, что вопрос под рукой.

2 голосов
/ 31 июля 2009

Звучит так, как будто вы можете выбирать. Если вы выберете float, вы можете потерять 11 цифр точности. Если это приемлемо, сделайте это - очевидно, дизайнеры Linq посчитали это хорошим компромиссом.

Однако, если вашему приложению нужны эти дополнительные цифры, используйте десятичную. Десятичная дробь (реализованная правильно) в любом случае намного точнее, чем поплавок - нет грязного перевода из базы 10 в базу 2 и обратно.

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