logo search
Модуль 03 Віконні застосування / Лекційний матемріал / Частина 1

3.4. Десятковий тип даних

У житті, як відомо, все складніше, ніж на папері. Це стосується і чисел. Наприклад, ви працюєте з бухгалтерськими документами, де, якщо втратиш хоч одну копійку, на яку не сходиться бухгалтерський баланс, ніхто у вас такий баланс не прийме. Скажуть, мовляв, ми нічого не знаємо і знати не хочемо про якісь там ваші комп'ютери. Тим більше, що вони працюють неточно. Шукайте, мовляв, куди ви поділи цю копійку, а знайдете, приходьте. Але не довго шукайте, інакше позбавимо премії за квартал. Все. Що робити? Ви біжите до програміста і починаєте у того з'ясовувати причини. А він знизує плечима: мовляв, з цілими числами я не можу працювати, бо у вас у бухгалтерії числа нецілі, тому працюю з нецілими. А ті в комп'ютері майже завжди неточні, і тому в результаті численних обчислень накопичується помилка. Ніякі маніпуляції з округленнями чисел не рятують. Скажіть, мовляв, спасибі, що тільки одну копійку втратили, а могли б і більше. У добрі докомп'ютерні часи так і бувало часто. Виходили із такої ситуації, хто як міг. Але ось ті, кому потрібно було все-таки продавати комп'ютери додумалися до такого типу даних, який би об'єднував в собі позитив цілих і нецілих чисел: з одного боку, не давав би помилок обчислення, як це відбувається з цілими числами, а з іншого боку міг би працювати і з дробовими числами. Цей тип назвали decimal (десятковий). Але чудес не буває: виграв в одному, програв в іншому. Дані цього типу уповільнюють роботу комп'ютера. І іноді - значно. Тому цей тип даних і використовується, в основному, у бухгалтерських розрахунках, де ніяких копійок ніколи втрачати не можна, інакше вами зацікавиться податкова інспекція. Інший недолік цього типу даних у тому, що їх не можна використати в якості різних лічильників у програмах, бо цей тип має все-таки дробову частину. Оголошуються в програмі змінні цього типу за загальним правилом оголошення:

тип ім’я_змінної

Ось три варіанти такого оголошення і пояснення, до чого це призводить:

decimal d1;

decimal d2 = 2;

decimal d3 = 2M;

У першому випадку для змінної d1 компілятор при компіляції програми виділить тільки пам'ять і на цьому заспокоїться. Змінна має невизначене значення (в ній просто якесь сміття, бо вона могла потрапити на ділянку пам'яті, яка зберігала якісь дані). У програмах бувають змінні, які, якщо вони не визначені при їх оголошенні, т. т. їм не присвоєні ніякі значення, то компілятор їх сам ініціалізував значеннями, прийнятими у нього за замовчуванням. Для чисел це зазвичай нуль. Але в C# так звані локальні змінні (ті, що оголошені усередині якоїсь функції, про них поговоримо пізніше) не ініціалізуються компілятором, якщо вони не ініціалізовані при їх оголошенні. Тому може статися, що при використанні такої змінної з невизначеним значенням виникне помилка обчислення. Отже, компілятор стане нагадувати вам, що змінна d1 не визначена. Цей факт демонструє рис. 3.1.

З рисунка видно, що змінна a оголошена, але не отримала початкового значення. Коли ми услід за нею написали команду b=a;, компілятор видав помилку компіляції. А якби a була ініціалізовані, помилки б не було. У разі оголошення decimal d2 = 2; все начебто нормально, але не зовсім. Річ у тому, що число 2 за замовчуванням розглядається як тип int, тому компілятор вимушений буде формувати команди перетворення числа типу int в число типу decimal. На це йде додатковий час комп'ютера.

А ось оголошення decimal d3 = 2M; вже не вимагає ніяких додаткових перетворень. Буква M після константи 2 вказує на те, що ця константа - типу decimal.