Autor Zpráva
nothrem
Profil
SELECT

( 25 * 37.05 ) AS '25*37.05',
round( 926.25, 1 ) AS '926.25',
round( 25 * 37.05, 1 ) AS '25*37.05'

------------------------------------

|25*37.05 | 926.25 | 25*37.05 |
------------------------------------
| 926.25 | 926.3 | 926.3 |
------------------------------------


---------------------------------------------------------------------- -----------------------
echo '25*37.05 = ',25*37.05;

echo '926.25 ~ ',round(926.25,1);
echo '25*37.05 ~ ',round(25*37.05,1);
echo '25*37.05 ^ ',round((STRING)(25*37.05),1);


25*37.05 = 926.25

926.25 ~ 926.3
25*37.05 ~ 926.2
25*37.05 ^ 926.3


?????????????????????????????????????????
WertriK
Profil
Nějak mi uniká pointa ....
nothrem
Profil
To mě taky unikalo několik hodin, všimni si předposlední řádky výsledku
DoubleThink
Profil *
Známý to problém se zaokrouhlováním v php.
Převodem operace do binární soustavy totiž vznikne něco takového:
25*37.05 = 926.24999999999999999999...
Změnou datového typu na řetězec se zaokrouhlí hodnota na 14míst a vznikne 926.25.
Pokud ale zaokrouhluješ přímo na 1 místo, bude výsledek 926.2
nothrem
Profil
@DoubleThink: To mě by ani tak nevadilo, že to vyjde matematicky špatně, ale proč v SQL (a v php při převodu ze stringu) to tedy vyjde dobře?

Teď jsem to zkoušel v Delphi a C++ a všechno vyjde 926.2 (dokonce i při převodu ze stringu) tak proč v SQL do vyjde dobře ?
nothrem
Profil
A další pokus: spusťte to samé na PHP běžící pod linuxem, a zas to vyjde matematicky správně.

viz Bug #36008 incorrect round() & number_format() result
nothrem
Profil
No dobře, už nejsem v ****, jen budu muset přepsat všechny funkce zaokrouhlení.

function rounds($number, $precision = null) { return round((string)$number, $precision); }

function ceils($number) { return ceil((string)$number); }
function floors($number) { return floor((string)$number); }
Toto téma je uzamčeno. Odpověď nelze zaslat.