Ответ 1
Внутренний тип данных SQL Server money
- это 64-разрядное целое число с подразумеваемой шкалой из 4 знаков после запятой. Чтобы процитировать "Книги в Интернете", это точно "десять тысяч тысяч единиц валюты". Это грубый эквивалент a decimal(19,4)
.
Причиной шкалы 4, а не 2 является сохранение точности результатов арифметики. Ваше обычное значение валюты имеет шкалу в 2 (например, 3,27 долл. США). Умножение или деление двух чисел, масштабированных до 2 десятичных знаков, дает результаты, которые точны до 4 знаков после запятой: 9.23, деленная на 3.27, дает результат 2.82262996941896 (приблизительно). Вы можете переносить результат на любую точность (количество знаков после запятой), которое вы желаете. Однако результат будет точным только до 4 знаков после запятой (2.8226), поскольку исходные значения были точными только до двух знаков после запятой. Это измерение точно в пределах от 1/2 наименьшего указанного устройства (+/- 0,005).
Но я отвлекаюсь.
В результате значения SQL Server money
, имеющего подразумеваемый масштаб 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
Приветствия,
Н.