Що являє собою подвійний сервер sql?


335

У мене є декілька властивостей, в C#яких знаходяться, doubleі я хочу зберігати їх у таблиці на SQL Server, але помітив, що doubleтипу немає , тож що найкраще використовувати, decimalабо float?

Це збереже значення широти та довготи, тому мені потрібна найточніша точність.

Дякую за відповіді поки що.


Ось відображення даних CLR на SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles

На MSDN є чудова нитка, що описує первинну різницю між FLOAT і DECIMAL. Коротше кажучи, Float є приблизним і не може представляти деякі значення. Подивіться на прийняту відповідь.
Меттью Джонс

Відповіді:


387
float

Або якщо ви хочете пройти стару школу:

real

Ви також можете використовувати float (53), але це означає те саме, що і float.

("real" є еквівалентом float (24), а не float / float (53).)

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

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

Щоб зробити речі більш заплутаними, "float" в C # є лише 32-розрядним, тому в SQL було б більш еквівалентно типу real / float (24) в MSSQL, ніж float / float (53).

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


1
Ти кажеш, пливе, Девід каже десятковий, тепер я ще більше розгублений :)
Xaisoft

Я використовую подвійні знаки в c #, і ці значення будуть значеннями широти та довготи у відповідних стовпцях.
Xaisoft

1
Я повинен погодитися і визнати, що я був поза базою. Мене ввели до десяткової у світі IBM DB2, де десятковий - це реальний тип даних, підтримуваний усіма смаками коду та базою даних на платформах IBM. Не те, що це не справжній тип даних у світі MS, але він не підтримується так само, як у таборі IBM. Вибачте, що створили будь-яку плутанину.
DaveN59

2
"MSSQL float не має точно такої ж точності, як 64-бітний подвійний тип в .NET (незначна різниця в mantissa IIRC), але це досить близька відповідність у більшості застосувань." Чи є у вас посилання на це? Наскільки я бачу, обидва використовують 53 біти
ознаки

2
Мені також дуже цікаво питання, поставлене @codekaizen (незначна різниця в mantissa). Чи є у вас посилання або тест, що це є прикладом?
Мадс Равн

62

Також ось хороша відповідь для картографування типу SQL-CLR з корисною діаграмою.

З цієї посади (від Девіда ): введіть тут опис зображення


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

15

float - найближчий еквівалент.

Перерахування SqlDbType

Для Lat / Long, як згадувалося в ОП.

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


1
Продавайте свої екранні технології Apple і заробляйте мільярди! (Швидка арифметика говорить про те, що у вас є найбільш екстремальна роздільна здатність, про яку я коли-небудь чув, навіть на широтах, близьких до Північного / Південного полюса; приблизно в мільярд разів вище моїх.)
Jonas Byström,


8

float у SQL Server насправді [редагувати: майже] точність "подвійної" (у сенсі C #).

floatє синонімом для float(53). 53 - шматочки мантіси.

.NET doubleвикористовує 54 біт для мантіси.


2
Власне, IIRC, подвійний в .NET, використовує 52-бітну мантісу та 11-бітний показник.
richardtallent

Я буду проклятий; ти маєш рацію! Цікаво, що робить SQL із додатковим бітом; він не використовується для показника. Якби це було, показник підніметься до + -616 замість + -308. Можливо, відстежувати NULL?
Euro Micelli

Тепер я розгублений. Кожен доказ свідчить про те, що вони використовують той самий формат (як і все в Windows). І чому б вони не? Я не можу знайти певне твердження про побітне представлення в SQL Server (окрім сторінки довідки для float). Я викладу виправлення, якщо дізнаюся.
Euro Micelli

5

Для SQL Sever:

Десятковий тип - це 128-бітове підписане число Float - це 64-бітове підписане число.

Справжня відповідь - Float , я не помилявся щодо десяткових.

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

Хоча десятковий не дасть вам помилки, якщо ви спробуєте використовувати тип int.

Ось хороша довідкова діаграма типів.


Тепер це ще більше заплутано у двох різних відповідях: p
Xaisoft

1
Не треба плутати. Ця відповідь неправильна. Десяткові - тип бази-10; Float (у SQL Server та CLR) - це базовий тип 2.
Майкл Петротта

3

Це здається, що ви можете вибрати і вибрати. Якщо ви виберете флоат, ви можете втратити 11 цифр точності. Якщо це прийнятно, продовжуйте це - очевидно, дизайнери Linq вважали це гарним компромісом.

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


Це для зберігання значень широти та довготи. Чи має це значення?
Xaisoft

Це просто неправильно ... і float / float (53) в MSSQL, і подвійний в C # мають приблизно 15 цифр точності. Вони не зовсім однакові, але досить близькі. Десяткові знаки, з іншого боку, є повним надмірним вмістом для зберігання дубля, і він повинен повернутися до бази 2 для всіх обчислень на SQL Server і повернутися до C # як подвійний.
richardtallent

Я стою виправлений. Те, що ви говорите, має для мене ідеальний сенс. Десяткові місця має сенс, лише якщо ви зберігаєте його як десяткове значення скрізь. Ви втрачаєте значення в будь-який час, коли здійснюєте конверсію з бази 10 на базу 2 (і назад).
DaveN59

-2

A Floatпредставляє doubleна SQL-сервері. Ви можете знайти доказ із кодування у C # у візуальній студії. Тут я оголосив Overtimeяк на FloatSQL-сервері, так і на C #. Таким чином я в змозі конвертувати

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

Тут OverTimeзаявленоfloat type

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.