Autor Zpráva
martin6541
Profil
Přejí pěkný den.
Bojuju s jednou funkí. Mám do jednoho programu (import/export produktů eshopu) vzoreček na převod ceny mezi eshopy.
Vzoreček vypadá takto:
(ROUND([CSV_COL(2)]*17.28571428571429, -2)) /1.2

Funguje to tak, že program vezme cenu bez DPH uvedenou v csv souboru, tu vynásobí nějakým koeficientem, ve kterém je zahrnut rozdíl v měně a dph . . .vzniklé číslo zaokrouhlí na stovky a odečtě 20% DPH.

Já potřebuji upravit zaokrouhlování tak, aby vždy bylo nahoru. Našel jsem funkci "CEIL" ale t zřejmě nefunguje na stejném principu jako ROUND . . . takže mi pouhé prohození slov ve vzorečku nepomůže.
Umíte mi to někdo upravit tak, abych [CSV_COL(2)]*17.28571428571429 uměl zaokrouhlit na stovky nahoru a následně odečetl 20% DPH?
Keeehi
Profil
CEIL([CSV_COL(2)]*17.28571428571429/100)*83.333333
martin6541
Profil
Keeehi:
Díky. Já vypotil tohle:
(CEIL(([CSV_COL(2)]*17.28571428571429)/100)*100) /1.2
je to blbě?
Keeehi
Profil
Měl jsem tam matematickou chybu. Už je to opraveno.
Jinak ten opravený zápis je ekvivalentní s tím tvým. Jen je to násobení stem a dělení 1.2 převedeno do jedné matematické operace.
Z výkonnostního hlediska je jedno co použiješ. Použij to, co se ti lépe čte.
martin6541
Profil
Keeehi:
Velmi si vážím tvého času, ale . . .
Uměl bys mi prosím vzoreček upravit i na možnost, že bych chtěl zaokrouhlovat na tisíce? Aktuálně je to na celé stovky.
Moc moc děkuji.
Keeehi
Profil
martin6541:
To je přece to samé. Stačí jen přidat nulu a posunout desetinnou tečku.
CEIL([CSV_COL(2)]*17.28571428571429/1000)*833.33333
(CEIL(([CSV_COL(2)]*17.28571428571429)/1000)*1000) /1.2
martin6541
Profil
Keeehi:
Děkuji
martin6541
Profil
Keeehi:
Dotaz. Zjistil jsem, že zaokrouhlování nahou funguje trochu jinak, než jsem myslel. Ono mi to zaokrouhlí i 0 na 10. Takže sem teď musel všechny ceny ručně upravit, protože sem si toho prvně nevšiml. Ceny ve tvaru například 12000,- teď mám 12010,-

Lze to nějak řešit?
Kajman
Profil
Obecně v počítačích je pro výsledek (např. dělení) jen určitý počet desetinných míst (navíc zapsaných ve dvojkové soustavě), takže pokud číslo vydělíte 1.2 a pak vynásobíte 1.2, nemusí být již přesně to samé číslo, ale může se nepatrně lišit, což může způsobit po zaokrouhlení nahoru změnu čísla.

Pro ignorování malých částí nad celé číslo by se možná mohlo použít klasické zaokrouhlování s přičtením třeba 0.49999

Když pak vyjde
12000.00000000000012, tak ceil to zaokrouhlí na 12001, ale round 12000.49999000000012 na 12000. Přesnost si pak určete podle svých potřeb.

Stejně tak, ale můžete narazit při ukládání ceny bez dph, tak aby cena s dph vyšla přesně. Můžete se pak v součtu dvou cen (bez dph, dph) zaokrouhlených na halíře dostat na necelé číslo.
Keeehi
Profil
Další možností je cenu neukládat jako desetinné číslo ale jen jako celá čísla, která zvládne počítač uložit přesně. Takže cenu nebudete ukládat v korunách ale v halířích. Jen to pak bude při výpisu potřeba vydělit 100.
Kajman
Profil
To, že to bude jinak ukládat, mu nepomůže, když to stejně násobí 1.2 nebo 1.21, zaokrouhlí a pak zpět dělí.

Databáze mívají dobrou podporu pro čísla s omezenými desetinnými místy. Často je interně právě ukládají jako celá čísla a ví, kde má být čárka. Takže to samé udělají za Tebe.
martin6541
Profil
V systému co používám se ukládá na 5 desitnných míst.

Napadlo mě řešení, jen si moc neumím domyslet všechny následky. Co takhle takovou cenu před zaokrouhlením vzít a odečíst 0,1?
1. Tím bych rovnou cenu například 12 000 Kč udělal 11 999,90 a po zaokrouhlení bych z ní měl nazpět 12 000
2. Cena 123,50 by pak byla 123,40 a po zaokrouhlení bych dostal totožný správný výsledek

Ale jak říkám, neumím si domyslet, co dalšícho bych tím mohl změnit. Ale ať přemýšlím jak přemýšlím, tak už mě nic nenapadá. Takže to možná bude pohodové řešení?
Keeehi
Profil
Kajman:
To, že to bude jinak ukládat, mu nepomůže, když to stejně násobí 1.2 nebo 1.21, zaokrouhlí a pak zpět dělí.

No myslím že by mohlo. Takhle by mohl vypadat příklad který daný sloupec vynásobí 1.2, pak to zaokrouhlí na desítky nahoru a vrátí výsledek zase v halířích. Po celou dobu se se vstupem pracuje jako s inetegerem nebo stringem, takže nehrozí problémy s desetinná čárkou.
(SUBSTR(column*12-1, 1, CHAR_LENGTH(column*12)-4)+1)*1000
Ale ano, nic hezkého to není.
Kajman
Profil
Ale on po zaokrouhlení ještě dělí 1.21.
Keeehi
Profil
Dělení 1.21 je to samé jako násobení 0.826446. Dá se tedy výsledek vynásobit 826446 a pak z konce oříznout správný počet znaků.

Ale jasně, než si to takhle dělat ručně a jestli to databáze podporuje, je určitě lepší využití nativní implementace.
Kajman
Profil
A kolik Ti vyjde při ořezávání třeba 2/3?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0