πŸš«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ столбцы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ float ΠΈ real ΠΏΡ€ΠΈ sql Π·Π°ΠΏΡ€ΠΎΡΠ°Ρ…πŸ“‰

ΠΠ΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real ΡΠ²Π»ΡΡŽΡ‚ΡΡ основными ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ ΠΈΡ… Π½Π΅Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ для использования Π² SQL запросах.

Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для хранСния вСщСствСнных чисСл. Однако, ΠΈΠ·-Π·Π° спСцифики прСдставлСния Ρ‚Π°ΠΊΠΈΡ… чисСл Π² памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ошибки округлСния ΠΈ нСточности ΠΏΡ€ΠΈ вычислСниях.

ΠŸΡ€ΠΈ использовании Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real Π² SQL запросах, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΈ ошибкам Π² арифмСтичСских опСрациях, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² сравнСнии чисСл.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… float:

CREATE TABLE products (
  id INT,
  price FLOAT
);

INSERT INTO products (id, price)
VALUES (1, 9.99), (2, 19.99), (3, 29.99);

SELECT * FROM products WHERE price = 9.99;

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создали Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ "products" с ΠΏΠΎΠ»Π΅ΠΌ "price" Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… float. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ нСсколько записСй с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ значСниями Ρ†Π΅Π½Ρ‹. Но ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм запрос "SELECT * FROM products WHERE price = 9.99;", ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 9.99 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΎ ΠΏΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π² float.

ВмСсто Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ числовыС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ numeric ΠΈΠ»ΠΈ decimal, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ ΠΈ вычислСниях вСщСствСнных чисСл. НапримСр:

CREATE TABLE products (
  id INT,
  price NUMERIC(10, 2)
);

INSERT INTO products (id, price)
VALUES (1, '9.99'), (2, '19.99'), (3, '29.99');

SELECT * FROM products WHERE price = '9.99';

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ использовали Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… numeric(10, 2), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ вСщСствСнныС числа с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 2 дСсятичных Π·Π½Π°ΠΊΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ запрос "SELECT * FROM products WHERE price = '9.99';" Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ столбцы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ float ΠΈ real ΠΏΡ€ΠΈ SQL запросах

Π’ SQL, Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдставлСния чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой. Π­Ρ‚ΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большими числами ΠΈΠ»ΠΈ Π΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌΠΈ значСниями, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡ… Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях.

1. ΠŸΠΎΡ‚Π΅Ρ€Ρ точности

Одной ΠΈΠ· основных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ использования float ΠΈ real столбцов являСтся потСря точности ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ вычислСний. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ошибки ΠΈ нСбольшая потСря точности ΠΈΠ·-Π·Π° способа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ числа хранятся ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.

НапримСр, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ SQL ΠΊΠΎΠ΄:


DECLARE @num1 FLOAT, @num2 FLOAT;
SET @num1 = 0.1;
SET @num2 = 0.2;
SELECT @num1 + @num2;

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся 0.3, Π½ΠΎ ΠΈΠ·-Π·Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ точности Ρ‚ΠΈΠΏΠ° float, фактичСским Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ 0.3.

2. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΠΎΡ‚Π΅Ρ€Ρ точности ΠΏΡ€ΠΈ расчСтах ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ сравнСния. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


DECLARE @num FLOAT;
SET @num = 10.3;
SELECT CASE WHEN @num = 10.3 THEN 'Equal' ELSE 'Not Equal' END;

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся "Equal", Π½ΠΎ ΠΈΠ·-Π·Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ точности Ρ‚ΠΈΠΏΠ° float, фактичСский Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ "Not Equal". Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСпрСдсказуСмому повСдСнию ΠΈ ошибкам Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

3. Π Π΅ΡΡƒΡ€ΡΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ

Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ большС рСсурсов для хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² сравнСнии с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с фиксированной Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ decimal ΠΈΠ»ΠΈ numeric. Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ столбцы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ float ΠΈ real, это Π²Π΅Π΄Π΅Ρ‚ ΠΊ большСй потрСбности Π² памяти ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ запросов, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

4. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ†Π΅Π»ΠΎΠΌ, хотя Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… float ΠΈ real ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях, ΠΈΡ… использованиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ остороТным ΠΈ осознанным. Если Π²Π°ΠΌ Π²Π°ΠΆΠ½Π° Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ расчСтов ΠΈ сравнСний Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… с фиксированной Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ decimal ΠΈΠ»ΠΈ numeric.

НапримСр, вмСсто:


CREATE TABLE MyTable (
    ID INT,
    Value FLOAT
);

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:


CREATE TABLE MyTable (
    ID INT,
    Value DECIMAL(10,2)
);

Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ точности ΠΈ нСпрСдсказуСмого повСдСния Π²Π°ΡˆΠΈΡ… SQL запросов.

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² MySQL: Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… FLOAT ΠΈ DOUBLE Π² MySQL

2.3 Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… - double, float

Π£Ρ€ΠΎΠΊ 31. SQL. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

Π“Π΄Π΅ Π² SELECT SQL: объяснСниС ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Π² SQL Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ: простоС руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Как Π²Ρ‹ΡƒΡ‡ΠΈΡ‚ΡŒ SQL: Π»Π΅Π³ΠΊΠΈΠΉ ΠΈ эффСктивный способ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

πŸš«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ столбцы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ float ΠΈ real ΠΏΡ€ΠΈ sql Π·Π°ΠΏΡ€ΠΎΡΠ°Ρ…πŸ“‰

Π“Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WHERE ΠΈΠ»ΠΈ SQL запросы? Π’ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

SQL: основы, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ