Ниже приведен пример программы, в которой тип 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 эти значения интерпретировались бы как стандартные константы с плавающей точкой, которые несовместимы с типом данных decimal. Тем не менее переменной типа decimal можно присвоить целое значение без суффикса т, например 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
Обратите внимание на то, что результат выполнения приведенной выше программы представлен с точностью ДО целого ряда десятичных разрядов, т.е. с явным избытком по сравнению с тем, что обычно требуется! Далее в этой главе будет показано, как подобный результат приводится к более "привлекательному" виду.
Символы
В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например C++, а 16-разрядным кодом, который называется уникодом (Unicode). В уникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char, представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством уникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в С#.
Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки. Так, в приведенном ниже фрагменте кода переменной ch присваивается символ X.
char ch; ch = 'X';
Значение типа char можно вывести на экран с помощью метода WriteLine (). Например, в следующей строке кода на экран выводится значение переменной ch.
Console'.WriteLine ("Значение ch равно: " + ch) ;
Несмотря на то что тип char определен в C# как целочисленный, его не следует путать со всеми остальными целочисленными типами. Дело в том, что в C# отсутствует автоматическое преобразование символьных значений в целочисленные и обратно. Например, следующий фрагмент кода содержит ошибку.
char ch;
ch = 88; // ошибка, не выйдет
Ошибочность приведенного выше фрагмента кода объясняется тем, что 8 8 — это целое значение, которое не преобразуется автоматически в символьное. При попытке скомпилировать данный фрагмент кода будет выдано соответствующее сообщение об ошибке. Для того чтобы операция присваивания целого значения символьной переменной оказалась допустимой, необходимо осуществить приведение типа, о котором речь пойдет далее в этой главе.