Материал предоставлен https://it.rfei.ru

Десятичный тип данных

Вероятно, самым интересным среди всех числовых типов данных в C# является тип decimal, который предназначен для применения в финансовых расчетах. Этот тип имеет разрядность 128 бит для представления числовых значений в пределах от 1E-28 до 7,9E+28. Вам, вероятно, известно, что для обычных арифметических вычислений с плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представить числа с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому, что этот тип данных способен представлять десятичные значения без ошибок округления, он особенно удобен для расчетов, связанных с финансами.

Ниже приведен пример программы, в которой тип decimal используется в конкретном финансовом расчете. В этой программе цена со скидкой рассчитывается на основании исходной цены и скидки в процентах.

// Использовать тип decimal для расчета скидки.

using System;

class UseDecimal {
  static void Main() {
    decimal price;
    decimal discount;
    decimal discounted_price;

    // Рассчитать цену со скидкой,
    price = 19.95m;
    discount = 0.15m;  // норма скидки составляет 15%

    discounted_price = price - (price * discount);

    Console.WriteLine("Цена со скидкой:  $" + discounted_price);
  }
}

Результат выполнения этой программы выглядит следующим образом.

Цена со скидкой: $16.9575

Обратите внимание на то, что значения констант типа decimal в приведенном выше примере программы указываются с суффиксом m. Дело в том, что без суффикса m эти значения интерпретировались бы как стандартные константы с плавающей точкой, которые несовместимы с типом данных decimal. Тем не менее переменной типа decimal можно присвоить целое значение без суффикса m, например 10.

Рассмотрим еще один пример применения типа decimal. В этом примере рассчитывается будущая стоимость капиталовложений с фиксированной нормой прибыли в течение ряда лет.

/*
Применить тип decimal для расчета будущей стоимости капиталовложений.
*/

using System;

class FutVal {
  static void Main() {
    decimal amount;
    decimal rate_of_return;
    int years, i;

    amount = 1000.0M;
    rate_of_return = 0.07M;
    years = 10;

    Console.WriteLine("Первоначальные капиталовложения:  $" + amount);
    Console.WriteLine("Норма прибыли:  " + rate_of_return);
    Console.WriteLine("В течение " + years + " лет");

    for (i = 0; i < years; i++)
      amount = amount + (amount * rate_of_return);
    Console.WriteLine("Будущая стоимость равна $" + amount);
  }
}

Вот как выглядит результат выполнения этой программы.

Первоначальные капиталовложения:  $1000
Норма прибыли:  0.07
В течение 10 лет
Будущая стоимость равна $1967.151357289565322490000

Обратите внимание на то, что результат выполнения приведенной выше программы представлен с точностью до целого ряда десятичных разрядов, т.е. с явным избытком по сравнению с тем, что обычно требуется! Далее будет показано, как подобный результат приводится к более «привлекательному» виду.

Типы для представления чисел с плавающей точкойСимволы