1. Дробові числа
Згадаємо наш проєкт — нехай це найпростіший калькулятор або будь-яка програма, де потрібні обчислення: від простого підрахунку грошей до складної фізики. У реальному житті багато величин не є цілими числами — і це нормально.
Отже, озброїмося новим типом даних!
У програмуванні дробові числа ще називають дійсними, або числами з плаваючою крапкою (floating-point). У C#, як і в більшості мов, їх використовують для зберігання не лише цілих, а й «дробових» значень: усіляких 3.14, -28.57, 2.718281828…
Дійсні числа поділяють на два основні типи:
| Тип | Зберігає | Діапазон значень (приблизно) | Точність | Типовий розмір |
|---|---|---|---|---|
|
Числа | ±1.5 × 10-45 … ±3.4 × 1038 | ~7 знаків після крапки | 4 байти |
|
Числа | ±5.0 × 10-324 … ±1.7 × 10308 | ~15–16 знаків після крапки | 8 байтів |
Тип float
Тип float отримав назву від floating-point number — числа з плаваючою крапкою. Дійсні числа — це математичні обʼєкти з певними властивостями, а компʼютер має багато обмежень. Тому некоректно називати дробові числа у C# дійсними: для них уживають назву «числа з плаваючою крапкою».
Тип float зазвичай зберігає 7 значущих цифр (наприклад, 0.1234567), порядок (ступінь) десятки й займає 4 байти памʼяті. Цього замало для точних обчислень, тож найчастіше використовують числа подвійної точності.
2. Оголошення та ініціалізація змінних типу double
Усе, як із int, тільки тепер використовуємо double.
// Оголошуємо змінну та присвоюємо їй значення Пі
double pi = 3.1415926;
// Можна оголосити й без ініціалізації
double averageSalary;
averageSalary = 91234.56;
// Можна обчислювати!
double pizzaPieces = 8;
double friends = 3;
double piecesPerFriend = pizzaPieces / friends; // 2.666... (а не 2)
Особливості синтаксису:
- Як десятковий роздільник використовується крапка (3.14). Якщо використаєте кому — отримаєте помилку компіляції.
- Суворо кажучи, якщо написати double d = 3;, помилки не буде — відбудеться неявне перетворення типів (ціле число перетвориться на дробове без втрати значення).
3. Введення та виведення дійсних чисел за допомогою Console
Спочатку спробуймо вивести дробове число:
double amount = 42.75;
Console.WriteLine(amount); // Виведе: 42.75
Усе гаразд! А якщо додати текст:
Console.WriteLine("На вашому рахунку: " + amount + " євро."); // На вашому рахунку: 42.75 євро.
Введення з клавіатури
Важливий момент: Console.ReadLine() завжди повертає рядок, тож його потрібно перетворити на тип double.
Console.WriteLine("Введіть температуру за вікном:");
string input = Console.ReadLine();
double temperature = double.Parse(input); // Перетворюємо рядок на double
Console.WriteLine("На вулиці зараз: " + temperature + " градусів.");
4. Тип double у дії: арифметика
Усі звичні операції (+, -, *, /) працюють так само, як і для int:
double distance = 100.5;
double time = 2.0;
double speed = distance / time; // 50.25
Console.WriteLine("Середня швидкість: " + speed); // Середня швидкість: 50.25
Це й уся арифметика. Єдина відмінність: результат ділення буде дробовим числом, якщо принаймні один з операндів має тип double.
Порівняємо з int
int a = 5, b = 2;
Console.WriteLine(a / b); // 2 (остача відкидається)
double aa = 5, bb = 2;
Console.WriteLine(aa / bb); // 2.5
5. Типові помилки та особливості під час роботи з double
Помилка перетворення рядка
Типова ситуація: користувач вводить 3,14, а програма очікує 3.14.
// Це викличе помилку, якщо введено "3,14"
double value = double.Parse(Console.ReadLine());
Якщо працювати з програмою в країнах, де кома — роздільник цілої та дробової частин (наприклад, Польща, Німеччина), то double.Parse спрацює нормально. Але якщо застосунок запущено з «англійськими» налаштуваннями, очікується крапка.
Неточність подання чисел у компʼютері
Тут у початківців зазвичай зʼявляється легке здивування:
double x = 0.1 + 0.2;
Console.WriteLine(x); // Хмм... 0.30000000000000004
Вітаємо, ви зіткнулися з «магією» подання дробових чисел усередині компʼютера. Річ у тім, що багато чисел неможливо точно подати у двійковій системі. Детальніше говоритимемо про це на наступній лекції. А зараз — не панікуйте! Для більшості застосунків це некритично, але у фінансах і точних науках є нюанси.
6. Важливо: double і int — автоматичне та явне перетворення
Буває, що ви додаєте ціле число до дробового або присвоюєте значення типу int змінній типу double — помилки не буде:
int i = 2;
double d = i; // Усе гаразд!
Console.WriteLine(d); // 2
double dd = 3.7;
int ii = (int) dd; // Потрібно явно перетворити тип double на тип int!
Console.WriteLine(ii); // 3, дробова частина відкинута
Часто це дивує: чому після перетворення дробова частина зникла? Тому що тип int не вміє зберігати дроби — усе, що після крапки, буде втрачено.
Детальніше про перетворення double у int і оператор (int) — у наступній лекції.
7. Форматоване виведення: охайно виводимо double
Часто за замовчуванням double виводиться із зайвими нулями. Можна відформатувати виведення:
double temp = 23.56789;
Console.WriteLine(temp); // 23.56789
Console.WriteLine(temp.ToString("F2")); // 23.57 (2 знаки після крапки)
Console.WriteLine($"{temp:F1}"); // 23.6 (інтерполяція рядків)
| Формат | Результат | Опис |
|---|---|---|
| "F0" | 24 | Без дробової частини |
| "F2" | 23.57 | Два знаки після крапки |
| "F5" | 23.56789 | Пʼять знаків після крапки |
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ