Autor Zpráva
janbarasek
Profil
Ahoj,
pracuji na vylepšování mé vytuněné kalkulačky a vyhledávače v jednom (pokud vás to zajímá, tak se podívejte, pracuji na tom projektu už několik měsíců). Chtěl bych přidat mnohem lepší podporu pro matematické dotazy a také mnoho nových výsledků, narazil jsem však na problém s čísly.

Mějme třeba toto číslo ve dvojkové soustavě: 1111111111111111111111111111111 (v desítkové to je 500000000000000), když jsem ho chtěl "zhezčit" pomocí toho, že budou číslovky vypsané po 3 a oddělené mezerou, tak jsem dostal zpět něco takového: "1 111 111 111 111 111 055 017 645 178 880.00000000000000000000000000000000000000000000000000".

Pokud bych můj script hodně zjednodušil, tak vypadá takto:
<?php
number_format('1111111111111111111111111111111', 50, '.', ' ');
?>

Nevadí mi ta hromada nul za desetinnou tečkou (s těmi si poradím hned při dalším kroku, kdy je zaokrouhlovací funkce úplně vyhodí), vadí mi tam fakt, že se číslo změní. Matematika je přesná věda a já to musím respektovat. Už se mi povedlo pomocí různých metod dosáhnout toho, že mohu dělat operace s mnohem většímy čísly, než PHP normálně dokáže (dělám to tak, že mám číslo uložené jako řetězec a pak operace dělám pomocí "školních algoritmů", jako kdybych to počítal z hlavy na papíru), nicméně toto jsem nějak nedokázal jednoduše vyřešit.
Napadlo mě to parsovat po znaku, ale toto řešení se mi příliš nezamlouvá. Myslíte si, že existuje nějaké jednoduché řešení, jak tuto chybu obejít?
pcmanik
Profil
janbarasek:
Na presné počítanie môžes využiť BC Math. number_format očakáva ako prvý parameter float, a ty mu predávaš string. Na formátovanie čísiel budeš musieť vytvoriť vlastnú funkciu.

Mimochodom základná operácia mocniteľa ti nefunguje - 2^6 vráti 4. Taktiež by si moho pridať matematické konštanty ako pi, e atď.
Alphard
Profil
janbarasek:
dělám to tak, že mám číslo uložené jako řetězec a pak operace dělám pomocí "školních algoritmů", jako kdybych to počítal z hlavy na papíru
Nebylo by lepší použít www.php.net/manual/en/book.bc.php nebo www.php.net/manual/en/book.gmp.php?
Obecně pro parsování matematických výrazů z textových vstupů je vhodné použít parser k tomu určený, třeba muParser, já jsem s ním ale dělal v C++, nevím, jak moc složité bude používat ho v php.

Uvedená nepřesnost vzniká, protože PHP ten string přetypuje na číslo – float. Jestli se tomu chcete vyhnout, musíte použít funkce, které s tím budou pracovat jako se stringem.

S kalkulačkou jsem si trochu hrál, má dost velké nedostatky, ale je jasné, že tohle je hodně pracný projekt. Zvlášť když srovnávám s WolframAlpha :-)

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: