C#

Рекламный модуль
мезонин установка.

Понятие числовых типов CLR

CLR имеет два главных типа чисел — целые числа и дробные числа. Оба эти типа данных ориентированы на значения, как объяснялось в предыдущем разделе. Метод Add () использовал тип int — целочисленный, ориентированный на значение тип. Как вы уже знаете, целые числа имеют предел, определенный емкостью их типов. Давайте рассмотрим следующее число. 123456 Это число имеет шесть знаков. Для примера представьте, что страница, которую вы читаете, допускает только шесть знакомест для цифр. На основании этой информации самое большое число, которое можно написать на данной странице, — это 999 999, а са¬мое маленькое — 0. Подобным способом определенные типы чисел вынуждают среду CLR налагать ограничения на количество знакомест, применяемых для представления чисел. Каждое знакоместо, регистр, может содержать 1 или 0, позволяя CLR представ¬лять числа в двоичной форме. Хотя компьютеры используют двоичную форму записи чисел, люди знакомы с де¬сятеричными числами; так, вычисляя самое большое число, возможное для хранения типом данных, вы возводите 2 в степень количества регистров, а затем вычитаете 1. В случае типа int имеется 32 регистра. Прежде чем мы вычислим самое большое число хтя типа int, давайте рассмотрим отрицательные числа. Фактически, верхний предел диапазона типа int вовсе не 4 294 967 295 (232 - 1), поскольку он может также хранить и отрицательные числа. Другими словами, он может хранить такое число как -2. Компьютер использует трюк, он резервирует первый регистр для знака числа (плюс или минус). В случае типа int это означает наличие только 31 знакоместа, поэтому самое большое число для него 2 147 483 647, а самое маленькое 2 147 483 648. Возвращаясь к примеру суммирования, мы знаем, когда результат суммирования (около 4 миллиардов) потребует в двоичном представлении 32-х регистров, у типа int не будет хтя них места. В программировании для описания числовых типов данных используется следую¬щая терминология (вам она вероятно знакома). • Бит (bit) — одно знакоместо, 8 битов составляет байт (byte). • Целые числа (integer) — целочисленные значения. • Числа с плавающей запятой (floating-point) — дробные числа. • Знаковые (signed). Это значит, что одно знакоместо числа зарезервировано для знака плюс или минус. Среда .NET поддерживает несколько типов числовых данных (перечисленных в табл. 2.1), они имеют определенный размер и возможности хранения. Таблица 2.1. Типы числовых данных .NET Тип Описание byte Беззнаковое 8-битовое целое число; значения от 0 до 255 sbyte , Знаковое 8-битовое целое число; значения от-128 до 127 u short Беззнаковое 16-битовое целое число; значения от 0 до 65 535 short Знаковое 16-битовое целое число; значения от -32 768 до 32 767 uint Беззнаковое 32-битовое целое число; значения от 0 до 4 294 967 295 int Знаковое 32-битовое целое число; значения от -2 147 483 648 до 2 147 483 647 ulong Беззнаковое 64-битовое целое число; значения от 0 до 18 446 744 073 709 551 615 long Знаковое 64-битовое целое число; значения от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 float 32-битовое число с плавающей запятой; значения от 1,5х10~45 до 3,4х1038 с точ- ностью семь цифр double 64-битовое число с плавающей запятой; значения от 5,0х10~324 до 1,7хЮ30В с точностью 15-16 цифр decimal Специальный 128-битовый тип данных; значения от 1,0х10~28 до х1028 с точно- стью по крайней мере 28 значащих цифр * * Tun decimal зачастую используется для финансовых данных, поскольку в связи с округлением вычисление может вернуть результат на один пенс меньше, чем правильный (например, 14,9999 вместо 15,00). При доступности такого разнообразия типов чисел можно задать вопрос, какие из них и когда использовать. Быстрый ответ — это зависит от ваших потребностей. При вы¬полнении научных вычислений вы, вероятно, должны использовать тип double или float. Если вы вычисляете ипотеку, то, вероятно, должны использовать тип decimal. Если вы перебираете набор, то, вероятно, используете тип int или long. Все зависит от того, с какой точностью вы хотите получать числовые значения. Точность числа — важная тема, пренебрегать ей нельзя. Рассмотрим следующий пример: каждая страна проводит перепись населения, по завершении которой мы узна¬ем удивительные факты. Например, в Канаде 31% людей разведен, а каждые 92 секун¬ды рождается новый канадец. На момент написания этой книги совокупное население Канады составляло 32 789 736 человек. Таким образом, на момент написания этой книги, разведено было 10 164 818 человек. Так, существует прямая зависимость между количеством рождений в Канаде и разводов (фактически 31%). Вы поразитесь, что рож¬дения и разводы устанавливаются в точке 10 164 818, не 10 164 819ине 10 164 820. Я, конечно, не циник, просто таковы числа, которые вы округляете. Я не могу сказать, что разведено будет 10 164 818 человек, поскольку я не уверен абсолютно в правильности выполнения расчетов. Я мог бы с некой вероятностью ска¬зать, разведется 10 164 818 человек ±100 000. Указание ± задает диапазон от 10 064 818 до 10 264 818 человек или, грубо говоря, 10,2 миллиона. Число 10,2 миллиона— это то, что сообщают журналистам и что большинство людей использовали бы в диалоге. Если я добавляю к 10,2 миллиона тысячу, то смогу ли сказать, что общее количество раз¬веденных 10 201 000? Однако 10,2 — это округление к самому близкому десятичному значению от миллиона, а добавление тысячи бессмысленно, поскольку это число мень¬ше порога округления. Ответ отрицательный, я не могу добавить 1000 к 10,2, посколь¬ку число 1000 не существенно по отношению к числу 10,2. Но 1000 я могу добавить к 10 164 818, получив 10 165 818, поскольку наиболее значащее число — это одиночное целое число. Возвращаясь к числовым типам, скажем, что целочисленные типы имеют стар¬шее значащее число. При суммировании целых чисел 1,5 и 1,5 получится результат 2, как показано на рис. 2.15. Теперь давайте распространим эту концепцию значащих цифр на примере типа чис¬ла с плавающей запятой, float, и рассмотрим пример, представленный на рис. 2.16. Как показано на рис. 2.16, если вы хотите сохранить точность при суммировании малого числа и большого, нужно использовать тип данных double. Но даже тип double имеет пределы и может обеспечить точность лишь от 15 до 16 цифр. Если нужна более высокая точность, можно использовать тип decimal, но он скорее подходит для финансовых вычислений. При финансовых вычислениях вы столкнетесь с проблемой суммирования очень больших чисел с малыми числами. Представьте, что вы Билл Гейтс с несколькими миллиардами на банковском счете. Когда банк начисляет процент, он должен знать его до пенса, поскольку их накопление со временем может со¬ставить приличную сумму. Фактически некоторые программисты "воровали" деньги из банков, собирая остаток округления до пенса на своем счете4. Теперь, когда вы познакомились с некоторыми проблемами работы с числами, давайте закончим приложение калькулятора.