loading..
Русский    English
03:49
листать

Float(n)

Как-то в одной социальной сети спросили, как убрать концевые нули в десятичных числах. Это было связано с подготовкой некоего отчета, где денежные суммы конкатенировались с текстом. В постановке задачи указывалось ограничение на два десятичных знака. Вот пример данных и требуемый результат:

дано    получить
0.00    0
10.00    10
2.50    2.5
100.00    100
11.33    11.33

Предлагались решения, построенные на разборе строки. Я тоже впал в подобную ересь :-) и предложил следующее решение.

Консоль
Выполнить
  1. SELECT num,
  2. CASE WHEN CAST(num AS INT) = num
  3.            THEN CAST(CAST(num AS INT) AS VARCHAR)
  4.            WHEN CAST(num*10 AS INT) = num*10
  5.            THEN LEFT(CAST(num AS VARCHAR), LEN(CAST(num AS VARCHAR)) - 1)
  6.             WHEN CAST(num*100 AS INT)=num*100
  7.             THEN CAST(num AS VARCHAR)
  8. END fnum
  9. FROM(
  10. SELECT 0.00 AS num
  11. UNION ALL SELECT 10.00
  12. UNION ALL SELECT 2.50
  13. UNION ALL SELECT 100
  14. UNION ALL SELECT 11.33
  15. ) X;

Не знаю, сколько бы это еще продолжалось, если бы один участник дискуссии не заметил, что все проблемы решает приведение к типу данных   Тип данных с плавающей точкой. float. Действительно,

Консоль
Выполнить
  1. SELECT num, CAST(num AS FLOAT) fnum
  2. FROM(
  3. SELECT 0.00 AS num
  4. UNION ALL SELECT 10.00
  5. UNION ALL SELECT 2.50
  6. UNION ALL SELECT 100
  7. UNION ALL SELECT 11.33
  8. ) X;

Однако при этом нужно помнить о приближенном характере данного типа, а именно о величине мантиссы в научном представлении числа.

В соответствии со стандартом, этот тип данных имеет аргумент - FLOAT(n), который может принимать значения от 1 до 53.  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server значения аргумента в диапазоне 1 - 24 трактует как 24, что соответствует точности 7 цифр, а в диапазоне 25 - 53 как 53, что соответствует точности 15 цифр. По умолчанию принимается значение 53.

Продемонстрируем сказанное следующим примером.

Консоль
Выполнить
  1. SELECT num,
  2. CAST(num AS FLOAT(24)) num_24,
  3. CAST(num AS FLOAT(53)) num_53
  4. FROM(
  5. SELECT 1234567.80 AS num
  6. UNION ALL SELECT  12345678.90
  7. UNION ALL SELECT 123456789012345.60
  8. UNION ALL SELECT 1234567890123456.70
  9. ) x;

num    num_24    num_53
1234567.80    1234568    1234567.8
12345678.90    1.234568E+07    12345678.9
123456789012345.60    1.234568E+14    123456789012346
1234567890123456.70    1.234568E+15    1.23456789012346E+15

MySQL (версия 5.0)

Не поддерживается преобразование к типу FLOAT.

PostgreSQL (версия 8.3.6)

Практически аналогичное поведение, за исключением того, что для параметра в диапазоне 1 – 24 точность составляет 6 цифр. Соответственно последние результаты будут выглядеть так:

num    num_24    num_53
1234567.80        1.23457e+006    1234567.8
12345678.90    1.23457e+007    12345678.9
123456789012345.60    1.23457e+014    123456789012346
1234567890123456.70    1.23457e+015    1.23456789012346e+015

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN Больше тэгов
Учебник обновлялся
вчера
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100