Portál AbcLinuxu, 8. května 2025 13:59

Dotaz: MySQL/MariaDB ROUND

Jesus Jimenez avatar 16.10.2013 16:47 Jesus Jimenez | skóre: 29
MySQL/MariaDB ROUND
Přečteno: 1098×
Odpovědět | Admin
DD,

tabulka t1, sloupce
`id` autoincrement
`c1` double
`c2` double
c1 = 605.5

mysql/mariadb konzoli:
select round(605.5);
+--------------+
| round(605.5) |
+--------------+
|          606 |
+--------------+

select round(c1) from t1;
+--------------+
| round(c1)    |
+--------------+
|          606 |
+--------------+

pridam proceduru
CREATE DEFINER=`root`@`localhost` PROCEDURE `t1_update_c2` (IN `myid` int(11))
    MODIFIES SQL DATA
BEGIN
UPDATE `t1` SET `c2` = ROUND(`c1`) WHERE `id`=myid;
END
a pokud ji pres trigger zavolam, v c2 mam 605 - tedy zaokrouhleni DOLU

spravne to funguje az pokud tu proceduru napisu takhle:
CREATE DEFINER=`root`@`localhost` PROCEDURE `t1_update_c2` (IN `myid` int(11))
    MODIFIES SQL DATA
BEGIN
UPDATE `t1` SET `c2` = CAST(`c1` AS DECIMAL) WHERE `id`=myid;
END
delam neco spatne ja, nebo je to na bugreport?
Doaenův zákon průtahů: Čím pomaleji pracuješ, tím méně naděláš chyb. -- Murphy
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.10.2013 09:44 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: MySQL/MariaDB ROUND
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tezko rict.
mysql> create table t (id int, c1 double, c2 double);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t (id, c1) values (1, 605.5);
Query OK, 1 row affected (0.10 sec)

mysql> select * from t;
+------+-------+------+
| id   | c1    | c2   |
+------+-------+------+
|    1 | 605.5 | NULL |
+------+-------+------+
1 row in set (0.00 sec)

mysql> select round(c1) from t where id = 1;
+-----------+
| round(c1) |
+-----------+
|       606 |
+-----------+
1 row in set (0.00 sec)

mysql> update t set c2 = round(c1) where id = 1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t where id = 1;
+------+-------+------+
| id   | c1    | c2   |
+------+-------+------+
|    1 | 605.5 |  606 |
+------+-------+------+
1 row in set (0.00 sec)

D.
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
Jesus Jimenez avatar 17.10.2013 10:38 Jesus Jimenez | skóre: 29
Rozbalit Rozbalit vše Re: MySQL/MariaDB ROUND
Nejde o ten jednoduchy update. Jde o round() v procedure. Zkuste tohle:
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `round_double` (IN `cislo` double)
BEGIN
SELECT ROUND(`cislo`);
END //
DELIMITER ;

call round_double(6.5);
vrati 6
DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `round_decimal` (IN `cislo` decimal(10, 2))
BEGIN
SELECT ROUND(`cislo`);
END //
DELIMITER ;

call round_decimal(6.5);
vrati 7

cili typy double, float v procedure zaokrouhli spatne, typ decimal spravne. Ale JENOM v procedure.
Doaenův zákon průtahů: Čím pomaleji pracuješ, tím méně naděláš chyb. -- Murphy
17.10.2013 11:30 Kit
Rozbalit Rozbalit vše Re: MySQL/MariaDB ROUND
Funguje to tak, že se double a float zaokrouhlí na SUDÉ. Je to jedno z pravidel zaokrouhlování. Decimal se zaokrouhlí nahoru.

Pokud se číslo 6.5 nachází ve výrazu jako konstanta, databáze ji považuje za typ DECIMAL a dle tvého se zaokrouhlí správně. Předáním do procedury je však přetypována na double a změní se tím zaokrouhlovací pravidla.
Jesus Jimenez avatar 17.10.2013 12:27 Jesus Jimenez | skóre: 29
Rozbalit Rozbalit vše Re: MySQL/MariaDB ROUND
jj, je to v dokumentaci. je to kazdopadne debilni pravidlo.
Doaenův zákon průtahů: Čím pomaleji pracuješ, tím méně naděláš chyb. -- Murphy
17.10.2013 12:53 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MySQL/MariaDB ROUND
Holt čísla s plovoucí desetinnou čárkou nejsou to samé co reální čísla.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.