Desetinná čísla a chyba součtu – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Desetinná čísla a chyba součtu – PHP – Fórum – Programujte.comDesetinná čísla a chyba součtu – PHP – Fórum – Programujte.com

 

prot
~ Anonymní uživatel
3 příspěvky
16. 11. 2015   #1
-
0
-

Zdravím,

je mi jasné, že float čísla nedokáží přesně zobrazit některá čísla úplně přesně.

Ale je možné, pokud vemu celé číslo a vydělím ho některým nesoudělným, výsledek uložím do databáze a později ho vynásobím tím, co jsem dělil originální číslo, abych nedostal po zaokrouhlení nahoru originální celé číslo?

To je aby platilo následující:

INT / N = x
ceil(x * N) != INT

kde INT, N jsou celá čísla a x je reálné číslo...

Podle mě po nějakém odseknutí výsledku po dělení, můžu dostat jen o chlub menší hodnotu a po sečtení a zaokrouhlení by se nemělo stát, že výsledek bude +- 1. Tedy vždy dostanu originální celé číslo INT.

Ale nevím, jestli uvažuju správně.

Díky

Nahlásit jako SPAM
IP: 85.92.63.–
peter
~ Anonymní uživatel
3981 příspěvků
16. 11. 2015   #2
-
0
-

Ano, je to mozne. Tusim je to takhle nejak. Ceil zaokrouhluje nahoru. Pokud se trefis s pocitanim zrovna na rozhrani, u ceil je to 0 a 0.1, tak dostanes jine vysledky. Totez plati pro round i floor.

    floor round ceil
-1   -1    -1    -1
-0.9  0    -1     0
-0.6  0    -1     0
-0.5  0    -1     0
-0.1  0     0     0
0     0     0     0
0.1   0     0     1
0.5   0     1     1
0.6   0     1     1
0.9   0     1     1
1     1     1     1
Nahlásit jako SPAM
IP: 2001:718:2601:26c:e9fc:94...–
peter
~ Anonymní uživatel
3981 příspěvků
16. 11. 2015   #3
-
0
-

Jo, u ceil je treba dalsi rozhrani -0.9 a -1 (proste tam, kde se meni cislo).
A krom toho, lze zaokrouhlovat i na 1000, coz by pak byla zmena +-1000 a nejen +-1

ocekavas 1000, ale
ceil(1001,1) = 1002
ceil(1001,10) = 1010
ceil(1001,100) = 1100
ceil(1001,1000) = 2000

Nahlásit jako SPAM
IP: 2001:718:2601:26c:e9fc:94...–
Kit+15
Guru
16. 11. 2015   #4
-
0
-

#1 prot
Místo funkce ceil() raději použij funkci round().

http://php.net/manual/en/function.round.php

Výpočty je však obvykle lepší dělat v databázi, protože ta chyby nedělá. Samozřejmě za předpokladu, že použiješ typ DECIMAL.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
prot
~ Anonymní uživatel
3 příspěvky
16. 11. 2015   #5
-
0
-

To je právě to. Co já potřebuji jsou čísla real, aby byli co nejpřesnější. To má vliv na další výpočty.

Abych to ještě upřesnil, vlastně mám určitý počet jednotek, který dělím mezi daný počet lidí. Pro každého člena tak vím, jakou část z toho celku "vlastní". Ale přitom potřebuju vědět ten celkový počet, což je vždy celé číslo.

Nahlásit jako SPAM
IP: 79.170.254.–
Kit+15
Guru
16. 11. 2015   #6
-
0
-

#5 prot
Pokud potřebuješ co nejpřesnější čísla, zapomeň na funkci ceil(), která vůbec přesná není a k danému účelu se vůbec nehodí.

Pokud potřebuješ dělit částku na ideální podíly, ukládej ho jako zlomek, tedy dvě celá čísla. Operace pak dělej vždy s celou dvojicí. Obávám se, že PHP není na práci s racionálními čísly vybaveno. Jsou však jazyky, které to umí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
23. 11. 2015   #7
-
0
-

Bys musel upresnit, co resis.
Treba spousta lidi si mysli, ze je naprosto cool mit seznam zbozi, vedle toho cenu bez dph a vedle s dph. A dole pak soucty. Jenze soucet desetinnych cisel vyjde treba 0.9, coz ceil zaokrouhli na 1. Ale soucet cisel ve sloupci dph vyjde 1.1, coz ceil zaokrouhli na 2. A najednou je problem, ze to lita o jednu korunu. Proc? Protoze zaokrouhlene cislo se muze od puvodniho lisit. Mas to primo v zakone, ze se dph uvadi jen z konecneho souctu.


Kit - Ceil se pouziva pro operace s penezi. Zaokrouhluje se obvykle nahoru na cele koruny. (ale tusim v nasem zakone se to dela opacne, dolu, aby mel vyhodu zakaznik)

Nahlásit jako SPAM
IP: 2001:718:2601:26c:4d4e:69...–
Kit+15
Guru
23. 11. 2015   #8
-
0
-

#7 peter
Hlavně se pro operaci s penězi nepoužívá typ float, ale decimal. Zaokrouhluje se podle běžných zvyklostí, jen DPH se zaokrouhluje nahoru. U každé vytvářené aplikace je nutné to vychytat pomocí testů.

Funkce ceil() se k zaokrouhlování zpravidla nehodí, protože se pro záporné hodnoty chová jinak, než jak bychom očekávali.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Podobná vlákna

Android desetinná čísla — založil hráč

Desetinná čárka — založil Martin

Desetinná místa — založil Jakub

Desetinná místa — založil lekejs

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý