Українська
Значення, типи та перетворення
Значення, змінна та тип
Тип визначає допустимі значення й операції. Змінна має статичний тип, навіть коли він не записаний після двокрапки. Наприклад, val count = 10 означає Int, а val count = 10L означає Long. Спроба присвоїти рядок змінній Int зупинить компіляцію до запуску програми.
val дозволяє одне присвоєння; var – повторне. Починайте з val і використовуйте var, коли зміна справді належить алгоритму: лічильник, сума або поточний стан циклу. Незмінність посилання не завжди означає незмінність об’єкта, на який воно вказує; це стане важливим у темі колекцій.
kotlin
fun main() {
val group = "КІ-26"
var present = 18
present += 2
val total: Int = 24
println("$group: $present із $total")
}Результат: КІ-26: 20 із 24. Ім’я present пояснює зміст, а тип Int – форму зберігання. Ім’я не може саме довести, що кількість невід’ємна або не більша за total; це перевірки предметного контракту.
Для справжньої константи часу компіляції на верхньому рівні використовують const val, наприклад const val DAYS = 7. Локальне val, обчислене з консолі, не є такою константою. У назвах не використовуйте транслітерацію типу kolvo: коротке зрозуміле count краще передає призначення.
Базові типи та представлення чисел
| Тип | Розмір | Призначення |
|---|---|---|
Byte | 8 біт | Цілі від −128 до 127 |
Short | 16 біт | Цілі від −32768 до 32767 |
Int | 32 біти | Звичайні цілі лічильники |
Long | 64 біти | Великі цілі та проміжні добутки |
Float | 32 біти | Двійкові дробові числа |
Double | 64 біти | Основний дробовий тип прикладів |
Boolean | Логічний | true або false |
Char | UTF-16 | Одна кодова одиниця |
String | Послідовність | Текст |
Int має межі −2147483648…2147483647. Літерал 1_000_000 легше прочитати, ніж суцільний ряд цифр. Суфікс L позначає Long, f – Float; 0xFF є шістнадцятковим, 0b1010 – двійковим записом. Літерал 1.0 має тип Double.
Беззнакові UInt і ULong не зберігають від’ємні значення, але все одно мають обмежену кількість бітів. Вони не перетворюють довільну арифметику на точну або захищену від переповнення. Для звичайних навчальних лічильників використовуємо Int/Long, щоб не змішувати типи без потреби.
Double зберігає наближення багатьох десяткових дробів. Тому фінансові суми у задачах із точними копійками краще зберігати цілими Long; дробові моделі застосовують там, де похибка та округлення визначені явно.
kotlin
fun main() {
println(Int.MAX_VALUE)
val x = 0.1 + 0.2
println(x)
println(kotlin.math.abs(x - 0.3) < 1e-12)
val cents = 125L * 3
println("Копійки: $cents")
}Результат: 2147483647, 0.30000000000000004, true, Копійки: 375. Допуск 1e-12 обрано лише для цього невеликого прикладу; універсального допуску для всіх одиниць і масштабів немає. Відносну й абсолютну похибку слід пов’язувати зі змістом вимірювання.
Перетворення та переповнення
Kotlin не виконує загального неявного присвоєння Int до Long: використайте toLong(). Водночас перевантажені арифметичні операції допускають певні комбінації числових типів. Тип результату слід перевіряти, а не вгадувати.
kotlin
fun main() {
val count = 50000
val unsafe = count * count
val safe = count.toLong() * count
println(unsafe)
println(safe)
println(3.9.toInt())
println((-3.9).toInt())
}Результат: -1794967296, 2500000000, 3, -3. Переповнення вже відбулося до присвоєння unsafe. Перетворення готового помилкового добутку на Long не відновить втрачену інформацію. Один з операндів потрібно розширити до виконання множення.
toInt() для дробового числа відкидає частину до нуля. Для округлення до найближчого цілого є roundToInt(); для гарантованого округлення вгору або вниз – ceil і floor. Обирайте правило за контрактом, наприклад кількість потрібних коробок округлюється вгору.
Зовнішній рядок можна перетворити через toIntOrNull() або toDoubleOrNull(). Невдала операція дає null, який програма повинна обробити. Для Double додатково перевіряйте isFinite(): NaN та нескінченність можуть бути числами формально, але не допустимими вимірюваннями.
Знімок екрана
Debug Int product versus Long product; show actual values.
Рис. 2.1. Тип добутку та переповнення Int у налагоджувачі