Какой правильный тип данных я должен использовать в этом случае?

Я должен представить числа в своей базе данных, которые представляют собой количество химических веществ в пище, таких как жиры, энергия, магний и другие. Эти значения являются десятичными в формате 12345,67.

Если я использую decimal (5,2) в качестве типа данных в SQL Server, он сопоставляется с типом Decimal в Entity Framework. Если я использую float в качестве типа данных в SQL Server, он сопоставляется с Double в Entity Framework.

Я не уверен, каким должен быть лучший тип данных в SQL Server, или это не имеет большого значения?

РЕДАКТИРОВАТЬ - в моем случае это должно быть decimal(7,2), как упоминалось в некоторых замечаниях!

Спасибо.


person L-Four    schedule 28.12.2011    source источник
comment
Обычно предпочтительнее DECIMAL - он не страдает от ошибок округления, таких как FLOAT   -  person marc_s    schedule 28.12.2011
comment
Проверьте stackoverflow.com/questions/618535/   -  person gsharp    schedule 28.12.2011
comment
если вам нужна точность и у вас есть конечное число ожидаемых значений после десятичной дроби, используйте десятичную дробь, если вам не нужна точность, используйте float. поиск по десятичной и плавающей запятой, чтобы увидеть причины.   -  person xQbert    schedule 28.12.2011
comment
Поскольку процентное содержание одних веществ в других веществах не имеет точной точности в 2 цифры, десятичный тип здесь не подходит. Например, вы не можете поместить 0,125 в десятичное (5,2) поле, но вы можете поставить его в число с плавающей запятой. Все люди, предлагающие десятичную систему, думают о деньгах!   -  person Mr Lister    schedule 28.12.2011
comment
@Mr Lister: Я также думаю о деньгах (имеется в виду, чтобы сэкономить деньги) :)   -  person L-Four    schedule 28.12.2011
comment
Итак, каковы бизнес-требования? Вы делаете математику для этих химических веществ и должны поддерживать уровень точности, или они уже оцениваются из-за необходимости отбрасывать незначащие цифры. Если вы уже отбрасываете незначащие цифры, с плавающей запятой все будет в порядке, поскольку ваши сохраненные значения уже неточны. вам просто нужно знать, что вам придется округлять их при рендеринге результатов; и чистая математика может не складываться из-за неточности числа с плавающей запятой.   -  person xQbert    schedule 28.12.2011


Ответы (2)


Вам нужно decimal(7,2)

  • 7 - общее количество цифр
  • 2 после запятой

Отличия:

  • float приблизительно и даст неожиданные результаты
  • десятичное число точно

Использованная литература:

person gbn    schedule 28.12.2011
comment
Спасибо. Я читал, что Decimal — самый точный тип, но если я использую Decimal (7,2), значит ли это, что на сервере sql не требуется много места для хранения? В таком случае я также читал, что Decimal работает медленнее всего в .NET, может ли это стать проблемой, если мне нужны эти числа в расчетах? - person L-Four; 28.12.2011
comment
@Lud: для десятичного числа (7,2) требуется 9 байт памяти. float 8 байт. Не большая разница, учитывая точность. Я бы не стал беспокоиться о производительности в .net, если у вас нет огромных объемов данных. Даже в этом случае математическая обработка .net double намного лучше, чем SQL Server, поэтому вы можете хранить decimal в базе данных, но при необходимости обрабатывать double в .net. - person gbn; 28.12.2011
comment
@Cicada, не понимаю твоего комментария... это бизнес-приложение, так..? - person L-Four; 28.12.2011
comment
@Lud Я имею в виду деньги / финансы, а не бизнес. Отредактировано. - person user703016; 28.12.2011

DECIMAL(7,2) было бы лучше, чем float - это именно то, что вам нужно (5 + 2 цифры). С плавающими типами (например, float, double) у вас могут возникнуть проблемы, например. с округлением.

person psur    schedule 28.12.2011
comment
На самом деле: DECIMAL(5,2) означает: 5 цифр всего — две из которых после запятой — так что на самом деле это 3+2 цифры (НЕ 5+2)! - person marc_s; 28.12.2011
comment
Хорошо, и не вызовет ли это проблем с производительностью при вычислениях, поскольку я читал, что десятичный тип — самый медленный тип в .NET? - person L-Four; 28.12.2011
comment
DECIMAL(5,2) может хранить максимум 999,99, всего 5 цифр со шкалой из двух знаков после запятой (msdn.microsoft.com/en-us/library/ms187746.aspx) - person Anthony Shaw; 28.12.2011