Внутренний тип данных SQL Server money
представляет собой 64-разрядное целое число с подразумеваемой шкалой из 4 десятичных знаков. Цитируя Books Online, это точно "до десяти тысячных единиц валюты". Это грубый эквивалент decimal(19,4)
.
Причиной шкалы 4, а не 2, является поддержание точности в результатах арифметики. Ваша обычная валюта имеет шкалу 2 (например, 3,27 доллара США). Умножение или деление двух чисел на 2 десятичных знака дает результаты с точностью до 4 десятичных знаков: 9,23, деленное на 3,27, дает результат 2,82262996941896 (приблизительно). Вы можете отнести результат с любой точностью (количество знаков после запятой), которую вы пожелаете. Однако результат составляет только с точностью до 4 десятичных знаков (2.8226), поскольку исходные значения были точными только до 2 десятичных знаков. Это измерение с точностью до 1/2 от наименьшей указанной единицы (+/- 0,005).
Но я отвлекся.
В результате значения money
SQL Server, имеющего подразумеваемую шкалу 4, ADO.Net преобразует значение в System.Decimal со шкалой 4. И, поскольку System.Decimal отслеживает масштаб, при преобразовании его в строку, вы получите 4 знака после запятой.
Чтобы получить меньше, вы можете
- Округлить его перед преобразованием, используя соответствующую
Decimal.Round()
перегрузку или
- Отформатируйте его по желанию (например,
(3.27M).ToString("0.00") ;
.
Надеюсь, это поможет.
Эта программа:
namespace Sandbox
{
using System ;
class Program
{
static void Main( string[] args )
{
decimal pi = (decimal) Math.PI ;
string piText = pi.ToString("0.00");
Console.WriteLine("PI to 2 decimal places is {0} one way, and {1:0.00} another" , piText , pi ) ;
return;
}
}
}
Производит то, что вы ожидаете:
PI to 2 decimal places is 3.14 one way, and 3.14 another
Приветствия
Н. * * тысяча тридцать шесть