Что представляет собой двойной сервер SQL?

335

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

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

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

Xaisoft
источник
Вот сопоставления типов данных CLR с SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Ахиллес
На MSDN есть отличная ветка, описывающая основное различие между FLOAT и DECIMAL. Короче говоря, Float является приблизительным и не может представлять некоторые значения. Посмотрите на принятый ответ.
Мэтью Джонс

Ответы:

387
float

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

real

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

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

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

Тип с плавающей запятой в MSSQL эквивалентен 64-битному двойному типу в .NET. (В моем первоначальном ответе от 2011 года говорилось, что в мантиссе может быть небольшая разница, но я проверил это в 2020 году, и они, кажется, на 100% совместимы в своем двоичном представлении как очень маленьких, так и очень больших чисел - см. Https: / /dotnetfiddle.net/wLX5Ox для моего теста).

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

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

richardtallent
источник
1
Вы говорите «плавать», Дэвид говорит «десятичное число», теперь я еще больше сбит с толку :)
Xaisoft
Я использую double в c #, и эти значения будут значениями широты и долготы в соответствующих столбцах.
Xaisoft
1
Я должен согласиться, и признать, что я был вне базы. Я познакомился с десятичной дробью в мире IBM DB2, где десятичная дробь - это реальный тип данных, поддерживаемый всеми разновидностями кода и базы данных на платформах IBM. Не то чтобы это не настоящий тип данных в мире MS, но он не поддерживается так же, как в лагере IBM. Извините за создание путаницы.
DaveN59
2
«MSSQL float не обладает точно такой же точностью, как 64-битный двойной тип в .NET (небольшая разница в мантиссе IIRC), но он достаточно близок к большинству применений». У вас есть ссылка на это? Насколько я могу видеть, оба используют 53 бита значения и используют 64 бита для хранения и имеют ту же структуру битов и значение, что и IEEE 754.
codekaizen
2
Мне также весьма любопытен вопрос, заданный @codekaizen (небольшая разница в мантиссе). У вас есть ссылка или тест, который иллюстрирует это?
Мэдс Равн
62

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

Из этого поста ( Дэвид ): введите описание изображения здесь

Mazdak Shojaie
источник
Ниже ссылка также использования; в нем есть информация, дополняющая вышеперечисленное, поскольку в нем показаны процедуры и перечисления SqlDataReader (в дополнение к сравнениям типов .NET и SQL) docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
d219
15

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

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

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

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

ГБН
источник
1
Продайте свой экран технологии Apple и заработайте миллиарды! (Быстрая арифметика говорит мне, что у вас самое экстремальное разрешение, о котором я когда-либо слышал, даже в широтах, близких к северному / южному полюсу; примерно в миллиард раз выше, чем у меня.)
Йонас Быстрем
10

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

RichardOD
источник
8

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

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

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

Евро Мицелли
источник
2
На самом деле, IIRC, double в .NET использует 52-битную мантиссу и 11-битную экспоненту.
Ричардталлент
Я буду чертовски; ты прав! Интересно, что делает SQL с дополнительным битом? это не используется для экспоненты. Если бы это было так, показатель степени поднялся бы до + -616 вместо + -308. Может быть, для отслеживания NULL?
Евро Мицелли
Теперь я в замешательстве. Каждое доказательство указывает на идею, что они используют один и тот же формат (как и все остальное в Windows). И почему бы и нет? Я не могу найти определенный оператор для побитового представления в SQL Server (кроме страницы помощи для float). Я опубликую исправление, если узнаю.
Евро Мицелли
5

Для SQL Server:

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

Реальный ответ - Float , я был не прав насчет десятичной дроби.

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

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

Вот хорошая справочная таблица типов.

Дэвид Басараб
источник
Теперь это еще более запутанно с двумя разными ответами: p
Xaisoft
1
Не смущайтесь. Этот ответ неверен. Десятичный тип - это основание-10; Float (в SQL Server и CLR) - это тип base-2.
Майкл Петротта
3

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

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

DaveN59
источник
Это для хранения значений широты и долготы. Это имеет значение?
Xaisoft
Это просто неправильно ... и float / float (53) в MSSQL, и double в C # имеют приблизительно 15 цифр точности. Они не совсем такие же, но достаточно близко. Десятичная, с другой стороны, является полным излишним для хранения double, и она должна вернуться к базе 2 для всех вычислений в SQL Server и вернуться к C # как double.
Ричардталлент
Я исправлен. То, что вы говорите, имеет смысл для меня. Десятичное число имеет смысл, только если вы сохраняете его как десятичное значение везде. Вы теряете ценность всякий раз, когда совершаете преобразование из базы 10 в базу 2 (и обратно).
DaveN59
-2

А Floatпредставляет doubleв SQL-сервере. Вы можете найти доказательства кодирования в C # в visual studio. Здесь я объявил Overtimeкак Floatв SQL-сервере и в C #. Таким образом, я могу конвертировать

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

Здесь OverTimeзаявленоfloat type

Md Shoriful Ислам
источник