Главная » C# » Типы числовых данных среды CLR

0

Среда CLR поддерживает два основных типа чисел: целые числа и дробные числа. Оба эти типа являются обычными. В методе Add() используется обычный целочиенный тип int . Как обсуждалось ранее, целые числа имеют верхний предел, котый устанавливается размером доступной памяти.

Возьмем, к примеру, число 123456.

Для выражения этого числа требуется шесть позиций. Допустим, например, что на данной странице можно представлять только числа, выражаемые шестью цифрами. На основе этой информации мы можем сделать вывод, что самым большим числом, которое можно выразить на этой  странице,  является  999 999,  а  самым  маленим — 0. Подобным образом специфичный числовой тип заставляет среду CLR накладывать ограничения на количество цифр, применяемых для выражения чисел данного типа. Каждая цифра, называемая битом,  может быть 1 или 0, т. к.  среда CLR выражает числа в двоичной системе счисления.

Чтобы узнать самое большое число, которое можно выразить данный тип данных, необходимо 2 возвести в степень, равную количеству цифр, и вычесть из результата 1 (т. е. 2" – 1, где п — количество цифр). Для выражения чисел типа in t применяюя 32 бита. Но прежде чем мы станем возводить 2 в 32-ю степень, нам необходимо принять во внимание отрицательные значения этого типа. В действительности верхний предел типа in t не 4 294 967 295 (232 – 1), т. к. тип in t также выражает отрицательные числа. Иными словами, переменные этого типа могут содержать отрицательные значения, такие как, например, -2 .

Для выражения знака двоичного числа используется его первый (самый старший) бит. Таким образом, для выражения собственно числа типа in t применяется только 31 бит из 32, что делает максимальное число, которое можно выразить этим типом, равным 2 147 483 647, а самое меньшее равным -2 147 483 648.  Возвращаясь теперь к нашей проблеме со сложением двух чисел по 2 млрд каждое,  мы  видим,

2 Г1о крайней мере, такова практика в США и странах Западной Европы. В США расплата ничными за  дорогостоящий и даже не  очень  дорогостоящий товар может вызвать подозрение персонала, что вы являетесь наркоторговцем.       Пер.

что тип  in t   не  имеет достаточного  количества  битов  для  выражения  результата в 4 млрд, для которого требуется 32 бита.

В табл. 2.1  перечислены предоставляемые в .NET типы данных и их описание. При описании числовых типов данных применяется следующая терминология:

•   бит — двоичная цифра; 8 битов составляют один байт-,

•   ijenoe число;

•   типы с плавающей точкой представляют дробные числа;

•   знаковый (signed) означает, что самый старший бит числа используется для  важения его знака.

Таблица     2.1.       Типы      числовых      данных       .NET

Ти п

Описани е

byt e

8-битовое  целое число  без  знака;  само е  меньшее  выражаемо е  числ о  равно  0, а  само е  больше е — 255

sbyte

Знаковое  8-битовое  целое число;  само е  меньше е  выражаемо е  числ о  равно

-128 ,  а  само е больше е —  127

ushort

16-битовое  целое  число  без  знака;  само е  меньшее  выражаемо е  числ о  равно 0,  а  само е  большее — 65 535

short

Знаковое  16-битовое  целое число;  само е  меньше е  выражаемо е числ о  равно

-3 2  768,  а  само е больше е — 32  767

uint

32-битовое  целое  число  без  знака;  само е  меньше е  выражаемо е числ о  равно 0,  а  само е больше е — 4 294 967 295

int

Знаковое  32-битовое  целое  число;  само е  меньшее  выражаемо е  числ о  равно

-2  147 483 648,  а  само е больше е — 2  147 483  647

ulong

64-битовое  целое  число  без  знака;  само е  меньше е  выражаемо е  числ о  равно 0,  а  само е больше е —  18 44 6 744 073 709 551  615

long

Знаковое  64-битовое  целое  число;  само е  меньшее  выражаемо е  числ о  равно

-9  223  372  036 854 775  808,  а  само е  большее — 9  22 3 372 036 854  775 807

float

32-битовое  число  с  плавающе й  запятой;  само е  меньше е  выражаемо е  числ о равно  1,5×10"45 ,  а  само е больше е — 3,4x1038 ,  с точность ю до  7 знаков

double

64-битовое  числ о  с  плавающе й  запятой;  само е  меньше е  выражаемо е  числ о равно 5,0×1 0  324 а само е большее—1,7×1  308 ,  с точностью от 15 до  17 знаков ,                                                     0

decimal

28

Специальны й  тип данных;  само е меньше е выражаемо е число  равно  1,0x10      , а  само е  больше е —  1,0x1028 ,  с точностью,  по  крайней  мере,  до 28 значащих цифр 3

3Тип decimal часто применяется для работы с финансовыми данными, т. к. по причине ошибок округления результаты вычислений здесь иногда получаются па копенку меньше, чем правилый результат (например, 14,9999 вместо 15,00). — Пер.

Имея такое множество числовых данных, естественным будет задать себе вопрос: какие из них  использовать и когда?  Ответ  прост: все зависит от  ваших надобнтей. Для научных вычислений, скорее всего, нужно будет использовать тип double или float. А для расчетов ипотечного кредита, вероятно, потребуется применение типа decimal. Для выполнения  же вычислений  с множествами подойдет тип  int или long. Все зависит от того, насколько точный или до какой разрядности резулат вы хотите получить.

Точность числа является важной темой, которую никогда не следует рассматривать поверхностно. Рассмотрим это на примере переписи населения, из которой, кроме общего количества населения, мы узнаем другую интересную информацию. Нример, в Канаде количество разведенных людей составляет 31% от всего населия. Также, в Канаде частота рождаемости составляет один новорожденный каую минуту и 32 секунды. На момент написания данной книги, население Канады составляет 32  899  736 человек.  Таким  образом,  на момент написания  этой  книги в Канаде было 10 164 818 разведенных людей. Подумайте немного о том, что было только что написано. А было написано, что существует прямая взаимосвязь между количеством разведенных людей и количеством новорожденных. Разве это не изительно, что рождаемость и разводы измеряются с такой точностью и что именно 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 млн и 1000, моо сказать, что мы получим 10 201 000? Число 10,2 является округлением к блайшей десятой миллиона, а добавляемое к нему число 1000 меньше, чем округленное число. Поэтому число 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. Но даже этот тип имеет свои ограничения и может представлять числа только с точностью от 15 до 16 цифр.

Рис. 2.16. Сложение дробных-чисел как чисел типа floa t

Если требуется еще более  высокая  точность,  используется  тип  decimal ,  но  этот тип более подходит для выполнения финансовых вычислений. В финансовых вислениях часто приходится выполнять сложение очень больших чисел с очень маленькими. Представьте себе, что вы Билл Гейтс и у вас несколько миллиардов на банковском счету. Когда банк насчитывает проценты, вы хотите знать, сколько центов у вас накопилось, т. к. из этих центов в течение многих лет накапливаются значительные суммы.  (Между прочим, были случаи, когда программисты "граби" банки на довольно крупные суммы, снимая доли цента с многих счетов и перодя их на свой счет.)

Теперь, когда мы в курсе некоторых сложностей, сопутствующих работе с числи, завершим наш Калькулятор.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии