Подтвердить что ты не робот

Что такое хорошее преобразование десятичной дешифровки .NET в SQL Server?

Мне нужно связать некоторый код С# с SQL Server, и я хочу иметь точно такую ​​же точность при сохранении значения в базе данных, как и с моим кодом С#. Я использую один из типов .NET decimal для значения. Какой тип данных/точность я буду использовать для этого значения в SQL Server?

Мне известно, что тип SQL Server decimal - это тип, который, скорее всего, соответствует моим потребностям. Мой вопрос заключается в том, какой масштаб и точность я использую, чтобы он соответствовал типу .NET decimal?

4b9b3361

Ответ 1

Здесь вы можете использовать тип SQL Server decimal (). Это позволяет вам указать точность и масштаб для чисел в базе данных, которые вы можете установить так же, как и в коде С#.

Однако ваш вопрос, похоже, связан с отображением десятичного типа .NET в десятичный тип SQL Server. И, к сожалению, это не просто. Десятичный код SQL Server с максимальной точностью охватывает диапазон от -10 38 +1 до 10 38 -1. Однако в .NET он может охватывать от ± 10 -28 до ± 7.9 × 10 28 в зависимости от числа.

Причина в том, что внутри .NET интерпретирует десятичные знаки, очень похожие на floats - он хранит его как пару чисел, мантиссы и экспонента. Если у вас особенно большая мантисса, вы потеряете часть точности. По сути,.NET позволяет смешивать числа, которые имеют как высокий, так и низкий масштаб; SQL Server требует, чтобы вы выбрали его для данного столбца раньше времени.

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

Ответ 2

Свободные nHibernate-карты System.Decimal как

decimal(19, 5)

Ответ 5

Короткий ответ заключается в том, что С# decimal является 128-битным числом точности с плавающей запятой и не имеет точного эквивалента на сервере Sql.

Может быть, в будущей версии Sql Server Microsoft совместит оба своих продукта и поддержит прямолинейный [clr/С# десятичный эквивалент] из 128-битного числа точности с плавающей запятой, чтобы напрямую сохраняться на своем сервере базы данных.

У меня была эта проблема анализа при работе с очень большими и очень маленькими количествами. В моем случае все сравнительные количества в моих решениях находятся внутри 64-битного диапазона, который может обрабатывать [С# double/sql float]. Итак, я решил использовать [С# double/sql float] при работе с количествами и [С# decimal/sql money] при работе с финансовой частью моих решений.