Читайте также:
|
|
Числа с плавающей точкой не всегда обязаны взаимодействовать или отображаться полностью. Например, можно хранить данные о денеж_ ных операциях с точностью до шести десятичных разрядов, но при отображении округлять их до сотых. Для ограничения точности чисел с плавающей точкой предназначены четыре функции – ceil(), floor(), round() и truncate(). Все три сервера включают эти функции, только Oracle Database использует trunc() вместо truncate(), а SQL Server – ceiling() вместо ceil().
Функции ceil() (потолок) и floor() (пол) предназначены для округле_ ния вверх или вниз до ближайшего целого, как показано в следующем примере:
mysql> SELECT CEIL(72.445), FLOOR(72.445);
+______________+_______________+
| CEIL(72.445) | FLOOR(72.445) |
+______________+_______________+
| | 73 | | 72 | |
+______________+_______________+
1 row in set (0.06 sec)
Как видите, любое число в диапазоне между 72 и 73 округляется до 73 (функция ceil()) или до 72 (функция floor()). Необходимо помнить, что ceil() округлит до 73, даже если десятичная часть числа очень ма_ ла, и floor() округлит до 72, даже если десятичная часть достаточно велика:
mysql> SELECT CEIL(72.000000001), FLOOR(72.999999999);
+____________________+_____________________+
| CEIL(72.000000001) | FLOOR(72.999999999) |
+____________________+_____________________+
| | 73 | | 72 | |
+____________________+_____________________+
1 row in set (0.00 sec)
Если предыдущие функции предлагают округления, слишком грубые для приложения, можно использовать функцию round() (округлить). Она округляет в большую или меньшую сторону от середины проме_ жутка между двумя целыми, например:
138 Глава 7. Создание, преобразование и работа с данными
mysql> SELECT ROUND(72.49999), ROUND(72.5), ROUND(72.50001);
+_________________+_____________+_________________+ | ROUND(72.49999) | ROUND(72.5) | ROUND(72.50001) | +_________________+_____________+_________________+
| | 72 | | 72 | | 73 | |
+_________________+_____________+_________________+ 1 row in set (0.00 sec)
При использовании функции round() любое число, десятичная часть которого относится к верхней половине диапазона между двумя целы_ ми, округляется с увеличением, а если его десятичная часть относится к нижней половине диапазона, то выполняется округление с уменьше_ нием.
Чаще всего требуется не округлять число до ближайшего целого, а со_ хранить, по крайней мере, несколько разрядов его десятичной части. Функция round() допускает необязательный второй аргумент, задаю_ щий число разрядов справа от десятичной точки, до которого прово_ дится округление. Следующий пример показывает, как можно ис_ пользовать второй аргумент для округления числа 72,0909 до первого, второго и третьего десятичного знака:
mysql> SELECT ROUND(72.0909, 1), ROUND(72.0909, 2), ROUND(72.0909, 3);
+___________________+___________________+___________________+ | ROUND(72.0909, 1) | ROUND(72.0909, 2) | ROUND(72.0909, 3) | +___________________+___________________+___________________+
| | 72.1 | | 72.09 | | 72.091 | |
+___________________+___________________+___________________+ 1 row in set (0.00 sec)
Как и функция round(), функция truncate() допускает необязательный второй аргумент, задающий число разрядов справа от десятичной точ_ ки, при этом truncate() просто отбрасывает лишние разряды без округ_ ления. Пример показывает, как было бы усечено число 72,0909 до од_ ного, двух и трех десятичных знаков:
mysql> SELECT TRUNCATE(72.0909, 1), TRUNCATE(72.0909, 2),
_> TRUNCATE(72.0909, 3);
+______________________+______________________+______________________+ | TRUNCATE(72.0909, 1) | TRUNCATE(72.0909, 2) | TRUNCATE(72.0909, 3) | +______________________+______________________+______________________+
| | 72.0 | | 72.09 | | 72.090 | |
+______________________+______________________+______________________+ 1 row in set (0.00 sec)
В SQL Server нет функции truncate(). Ее роль играет функция round(), допуская третий необязательный аргумент; если он при_ сутствует и отличен от нуля, выполняется усечение, а не округ_ ление числа.
Обе функции, truncate() и round(), также допускают отрицательное зна_ чение второго аргумента, означающее усечение или округление числа
Числовые данные | |
слева от десятичной точки. На первый взгляд эта возможность может показаться странной, но для ее наличия есть веские основания. Напри_ мер, есть продукт, закупка которого возможна только в количестве, пропорциональном десяти. Если покупатель закажет 17 единиц, то из_ менить заказанное количество можно одним из следующих способов:
mysql> SELECT ROUND(17, _1), TRUNCATE(17, _1);
+_______________+__________________+ | ROUND(17, _1) | TRUNCATE(17, _1) | +_______________+__________________+
| | 20 | | 10 | |
+_______________+__________________+ 1 row in set (0.00 sec)
Если рассматриваемый продукт – канцелярские кнопки, то, скорее всего, итоговая сумма не сильно зависит от того, продано 10 или 20 штук при запрошенных 17; однако если речь идет о часах Rolex, для процветания бизнеса лучше будет округлять.
Дата добавления: 2015-08-17; просмотров: 52 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Выполнение арифметических операций | | | Обработка данных со знаком |