У меня есть несколько свойств, в C#
которых есть, double
и я хочу сохранить их в таблице в SQL Server, но заметил, что нет double
типа, так что лучше использовать, decimal
или float
?
Это будет хранить значения широты и долготы, поэтому мне нужна самая точная точность.
Спасибо за ответы до сих пор.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
источник
источник
Ответы:
Или, если вы хотите пойти в старой школе:
Вы также можете использовать 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 знаков после запятой, а не за то, что вы получите кучу незначительных цифр для поездки.
источник
Кроме того, вот хороший ответ для SQL-CLR Type Mapping с полезной диаграммой.
Из этого поста ( Дэвид ):
источник
float является ближайшим аналогом.
Перечисление SqlDbType
Для широты / долготы, как указано выше.
Метр - это 1/40 000 000 широты, 1 секунда - около 30 метров. Float / double даст вам 15 значимых цифр. С некоторой быстрой и хитрой ментальной арифметикой ... ошибки округления / аппроксимации будут примерно равны длине этой остановки заполнения -> "."
источник
Вы должны сопоставить его с FLOAT (53) - это то, что делает LINQ to SQL .
источник
float
в SQL Server фактически имеет [edit: почти] точность «double» (в смысле C #).float
это синоним дляfloat(53)
. 53 - биты мантиссы..NET
double
использует 54 бит для мантиссы.источник
Для SQL Server:
Тип десятичного числа - 128-битное число со знаком. Число с плавающей запятой - 64-битное число со знаком.
Реальный ответ - Float , я был не прав насчет десятичной дроби.
Причина в том, что если вы используете десятичную дробь, вы никогда не будете заполнять 64 бит десятичного типа.
Хотя десятичная дробь не выдаст ошибку, если вы попытаетесь использовать тип int.
Вот хорошая справочная таблица типов.
источник
Похоже, вы можете выбирать. Если вы выберете float, вы можете потерять 11 цифр точности. Если это приемлемо, сделайте это - очевидно, дизайнеры Linq сочли это хорошим компромиссом.
Однако, если вашему приложению нужны эти дополнительные цифры, используйте десятичную. В любом случае десятичная дробь (реализованная правильно) намного точнее, чем поплавок - нет грязного перевода из базы 10 в базу 2 и обратно.
источник
А
Float
представляетdouble
в SQL-сервере. Вы можете найти доказательства кодирования в C # в visual studio. Здесь я объявилOvertime
какFloat
в SQL-сервере и в C #. Таким образом, я могу конвертироватьЗдесь
OverTime
заявленоfloat type
источник