decimal (Справочник по C#)decimal (C# Reference)

Ключевое слово decimal обозначает 128-разрядный тип данных.The decimal keyword indicates a 128-bit data type. По сравнению с другими типами данных с плавающей запятой, диапазон значений decimal меньше, а точность выше, благодаря чему этот тип подходит для финансовых расчетов.Compared to other floating-point types, the decimal type has more precision and a smaller range, which makes it appropriate for financial and monetary calculations. В следующей таблице представлен приблизительный диапазон значений и точность для типа decimal.The approximate range and precision for the decimal type are shown in the following table.

ТипType Приблизительный диапазон значенийApproximate Range ТочностьPrecision Тип .NET.NET type
decimal от ±1,0 x 10-28 до ±7,9228 x 1028±1.0 x 10-28 to ±7.9228 x 1028 28–29 значащих цифр28-29 significant digits System.Decimal

Значением переменной decimal по умолчанию является 0m.The default value of a decimal is 0m.

ЛитералыLiterals

Если требуется, чтобы числовой действительный литерал рассматривался как decimal, следует использовать суффикс m или M, например:If you want a numeric real literal to be treated as decimal, use the suffix m or M, for example:

decimal myMoney = 300.5m;

Если суффикс m отсутствует, число рассматривается как double и возникает ошибка компилятора.Without the suffix m, the number is treated as a double and generates a compiler error.

ПреобразованияConversions

Целочисленные типы неявно преобразуются в тип decimal и результатом является тип decimal.The integral types are implicitly converted to decimal and the result evaluates to decimal. Поэтому инициализацию десятичной переменной можно выполнить с помощью целочисленного литерала без суффикса следующим образом:Therefore you can initialize a decimal variable using an integer literal, without the suffix, as follows:

decimal myMoney = 300;

Неявное преобразование между другими типами с плавающей запятой и типом decimal отсутствует, поэтому для преобразования между этими двумя типами следует использовать приведение.There is no implicit conversion between other floating-point types and the decimal type; therefore, a cast must be used to convert between these two types. Например:For example:

decimal myMoney = 99.9m;
double x = (double)myMoney;
myMoney = (decimal)x;

Тип decimal можно использовать в одном выражении вместе с целочисленными типами числовых данных.You can also mix decimal and numeric integral types in the same expression. Однако использование типа decimal вместе с другими типами с плавающей запятой без приведения вызовет ошибку компиляции.However, mixing decimal and other floating-point types without a cast causes a compilation error.

Дополнительные сведения о неявных числовых преобразованиях см. в разделе Таблица неявных числовых преобразований.For more information about implicit numeric conversions, see Implicit Numeric Conversions Table.

Дополнительные сведения о явных числовых преобразованиях см. в разделе Таблица явных числовых преобразований.For more information about explicit numeric conversions, see Explicit Numeric Conversions Table.

Форматирование десятичных выходных данныхFormatting decimal output

Для форматирования результатов можно воспользоваться методом String.Format или методом Console.Write, вызывающим метод String.Format().You can format the results by using the String.Format method, or through the Console.Write method, which calls String.Format(). Формат денежных единиц задается с помощью стандартной строки формата денежных единиц "C" или "c", как показано во втором примере далее в данной статье.The currency format is specified by using the standard currency format string "C" or "c," as shown in the second example later in this article. Дополнительные сведения о методе String.Format см. в разделе String.Format.For more information about the String.Format method, see String.Format.

ПримерExample

В приведенном ниже примере возникает ошибка компилятора при попытке сложить переменные типов double и decimal.The following example causes a compiler error by trying to add double and decimal variables.

decimal dec = 0m;
double dub = 9;
// The following line causes an error that reads "Operator '+' cannot be applied to
// operands of type 'double' and 'decimal'"
Console.WriteLine(dec + dub);

// You can fix the error by using explicit casting of either operand.
Console.WriteLine(dec + (decimal)dub);
Console.WriteLine((double)dec + dub);

В результате выводится следующее сообщение об ошибке:The result is the following error:

Operator '+' cannot be applied to operands of type 'double' and 'decimal'

В приведенном ниже примере в одном выражении используются переменные типов decimal и int.In this example, a decimal and an int are mixed in the same expression. В результате возвращается тип decimal.The result evaluates to the decimal type.

public class TestDecimal
{
    static void Main()
    {
        decimal d = 9.1m;
        int y = 3;
        Console.WriteLine(d + y);   // Result converted to decimal
    }
}
// Output: 12.1

ПримерExample

В следующем примере для форматирования выходных данных используется строка формата денежных единиц.In this example, the output is formatted by using the currency format string. Обратите внимание на округление переменной x, поскольку десятичные разряды превышают 0,99 долл. США.Notice that x is rounded because the decimal places exceed $0.99. Переменная y, представляющая максимально точные цифры, отображается в правильном формате.The variable y, which represents the maximum exact digits, is displayed exactly in the correct format.

public class TestDecimalFormat
{
    static void Main()
    {
        decimal x = 0.999m;
        decimal y = 9999999999999999999999999999m;
        Console.WriteLine("My amount = {0:C}", x);
        Console.WriteLine("Your amount = {0:C}", y);
    }
}
/* Output:
    My amount = $1.00
    Your amount = $9,999,999,999,999,999,999,999,999,999.00
*/

Спецификация языка C#C# language specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also