Ceil() & Floor() a jednoduchá podmínka – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Ceil() & Floor() a jednoduchá podmínka – PHP – Fórum – Programujte.comCeil() & Floor() a jednoduchá podmínka – PHP – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Dawo
~ Anonymní uživatel
19 příspěvků
24. 2. 2010   #1
-
0
-

Dokážete mi to, prosím, někdo racionálně vysvětlit? :D

$a = (float)4.20;

$b = (float)1.40;
$c = $a/$b;


if(($a/$b) == floor($a/$b)) echo "OK"; else echo "KO";
echo "<br>Nezaokrouhleno: ".$c." | Zaokrouhleno dolů: ".floor($c)." |
Zaokrouhleno nahoru: ".ceil($c);
exit;


odpověď je následující

KO

Nezaokrouhleno: 3 | Zaokrouhleno dolů: 3 | Zaokrouhleno nahoru: 4


Jsem z toho v šoku 8o] - když dosadím do proměnné jiné číslo (1.40, 2.80, 5.60,
...) tak to zase funguje ... ale čísla (4.20, 8.40, 9.60, ...) ne :D

Nahlásit jako SPAM
IP: 85.132.219.–
Reklama
Reklama
Spectator0
Věrný člen
24. 2. 2010   #2
-
0
-

To Dawo : nejsem si uplně jist, ale řekl bych, že to souvisí s tim, že porovnávání operací s float čísli je dost nebezpečné a to z toho důvodu, že float může obsahovat třeba až na čtrnáctém desetinném místě nějaké číslíčko. Skoro v každé literatuře se porovnávání floatu nedoporučuje

Nahlásit jako SPAM
IP: 81.19.47.–
. . .
Dawo
~ Anonymní uživatel
19 příspěvků
24. 2. 2010   #3
-
0
-

To Spectator :
Okay, rozumím .. dejme tomu, že by to tím být mohlo ... jaké je tedy navrhované řešení?
Protože mě nic nenapadá (snad jen oseknout to jako string od tečky a zjišťovat jestli tam něco je většího než 0) ...

BTW - ještě jednou řešení, které mne napadlo bylo

if(2%1.4) echo 'Zbytek'; else echo 'Bezezbytku';

toto řešení ale také nefunguje... :-/

Nahlásit jako SPAM
IP: 85.132.219.–
Roma_CZ
~ Anonymní uživatel
4 příspěvky
25. 2. 2010   #4
-
0
-

Ahoj,
Já řešil v AWKu něco podobného a nenapadlo mě lepší řešení jak zjistit jestli jsou ty čísla "shodná" než je od sebe odečíst a teprve rozdíl porovnat s něčím (mně stačila přesnost 0.5).

if ((((VAR_A - VAR_B) >= 0) && ((VAR_A - VAR_B) < 0.5))  || \

(((VAR_A - VAR_B) < 0) && ((VAR_A - VAR_B) > -0.5))) {


... Nepřipadá mi to jako nejlepší řešení, ale funguje mi to - přesto budu rád za lepší řešení /.-)

Nahlásit jako SPAM
IP: 78.24.11.–
Dawo
~ Anonymní uživatel
19 příspěvků
25. 2. 2010   #5
-
0
-

To Roma_CZ : já to vyřešil úplně stupidně (a tím netvrdím, že nejlépe). Čísla jsem si převedl na string a ten zaokrouhlil ... funguje == spokojenost ;)

Spíš jsem byl vůbec v šoku z toho, že je float nepřesný... kdyby s tím alespon PHP funkce nějak počítaly... ale naoko vypsat "3" a myslet si "2.999999..." to je prostě síla, alespon pro mne..

Nahlásit jako SPAM
IP: 85.132.219.–
Spectator0
Věrný člen
25. 2. 2010   #6
-
0
-

To Dawo : Tim strongem to tak řešívám. Ono když si přečteš teorii o datových typech, tak by ses ani tolik tý nepřesnosti nedivil. Btw ta nepřesnost platí pro většinu jazyků =) =)

Nahlásit jako SPAM
IP: 81.19.47.–
. . .
d.mostek0
Návštěvník
25. 2. 2010   #7
-
0
-

To Dawo : Zase tak překvapivé to není ne? Vždyť ani člověk neumí vyjádřit desetinná čísla přesně, natož počítače. Porovnání destiných čísel lze také provést odečtením a porovnáním s nějakou chybou, kterou jsme schopni akceptovat. Například takto:
if( abs(a - b) < 0.0005 ){ ... } Ale taky to nemusí být uplně přesné.

Nahlásit jako SPAM
IP: 81.200.55.–
www.dominik-mostek.cz
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, 69 hostů

 

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