Округление
В предыдущем упражнении 10 / 3.0 дало 3.33333333333333. Никто не хочет платить $13,3333333333333, поэтому цены нужно округлять, а для этого в SQL есть функции.
Функция — это маленькая готовая программа: вы даёте ей значения, а она возвращает результат. Вы пишете её название, а после него в скобках через запятую — значения, с которыми она должна работать, её аргументы. В ROUND(10 / 3.0, 2) функция ROUND получает два аргумента, 10 / 3.0 и 2, и возвращает 3.33. В SQLite десятки функций, и в этом уроке вы познакомитесь с самыми полезными. Регистр в их названиях не важен (round тоже сработает), но в этом курсе большинство из них записано заглавными буквами, как ключевые слова.
ROUND(x, digits) округляет число x до указанного количества знаков после запятой. С одним аргументом ROUND(x) округляет до целого. Половина округляется вверх, от нуля: 2.5 становится 3.0, а -2.5 становится -3.0.
SELECT ROUND(3.14159, 2) AS pi, ROUND(2.5) AS half, ROUND(12.5, 2) AS cents;| pi | half | cents |
|---|---|---|
| 3.14 | 3.0 | 12.5 |
Здесь важны два момента. ROUND всегда возвращает десятичное число, даже если округляет до целого: 3.0, а не 3. И она не добавляет нули в конце: 12.5, округлённое до двух знаков, остаётся 12.5, а не 12.50.
Функцию можно использовать везде, где можно использовать значение: в SELECT рядом со столбцами или в вычислении. Её аргументами тоже могут быть столбцы и целые вычисления. Допустим, евро стоит $1,17. Вот цены в евро, округлённые до центов:
SELECT title, price, ROUND(price / 1.17, 2) AS euros
FROM games
LIMIT 3;| title | price | euros |
|---|---|---|
| Dragon Forge | 40 | 34.19 |
| Pixel Racer | 15 | 12.82 |
| Moon Farm | 20 | 17.09 |
SQLite работает изнутри наружу: сначала делит цену на 1.17, а потом округляет результат. Как и любое вычисление, результат нужно назвать с помощью AS; иначе столбец будет называться по всему вызову, ROUND(price / 1.17, 2).
Ещё одна функция для чисел — ABS(x), абсолютное значение: число без знака минус. И ABS(-5), и ABS(5) дают 5. Она удобна, когда важна только величина разницы, например, насколько цена игры отличается от $30, выше она или ниже: ABS(price - 30).
Типичная ошибка: округление результата деления нацело. ROUND(price / 3, 2) для игры за $40 даёт 13.0, а не 13.33, потому что 40 / 3 равно 13 ещё до того, как ROUND его получит. Округление не вернёт то, что отбросило деление, поэтому делите на 3.0.
Задание
- 1
Скоро Чёрная пятница, и на каждую игру скидка 15%. Покажите название, цену и цену со скидкой как
sale_price: цену, умноженную на 0.85 и округлённую до целых долларов. Отсортируйте игры по названию:title price sale_price Bakery Story 15 13.0 Castle Siege 30 26.0 Cube Logic 5 4.0 Dragon Forge 40 34.0 … … … - 2
Ниже снова предложите платежи по частям, на этот раз тремя: покажите название, цену и цену, делённую на 3 и округлённую до центов (двух знаков после запятой), как
installment. Отсортируйте игры по цене от самой высокой, а игры с одинаковой ценой — по названию:title price installment Knight's Oath 60 20.0 Goal Rush 50 16.67 Ice Hockey Pro 45 15.0 … … …