Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » Sherif 21:10
 » leon 21:10
 » Hitman 21:09
 » kemilk 21:08
 » Kenny 21:07
 » DJopek 21:01
 » ToM78 20:59
 » zibi13 20:58
 » matali 20:57
 » Kelso1 20:55
 » Wedrowiec 20:45
 » JE Jacaw 20:42
 » piwo1 20:41
 » wrrr 20:39
 » rkowalcz 20:38
 » adolphik 20:33
 » burz 20:32
 » kombajn4 20:28
 » mravel 20:15
 » dugi 20:14

 Dzisiaj przeczytano
 36904 postów,
 wczoraj 25433

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2025
A R C H I W A L N A   W I A D O M O Ś Ć
    

[PHP] Porównywanie liczb problem , PaKu 14/11/07 20:24
Sytuacja w duzym uproszczeniu wyglada tak:

mam 2 tabele w bazie danych mysql typu InnoDB. W pierwszej tabeli tabela1 mam pole ilosc typu decimal 12,3 w tabela2 mam takze pole ilosc2 decimal 12,3.

wykonuje 2 selecty, pare obliczen na tych polach i pozniej pod:
$ilosc1 mam np 234.23
a w $tabela['ilosc2'] mam rowniez np 234.23

i mam warunek
if($ilosc1==$tabela['ilosc2'])
echo "zgadza sie";
else
echo "nie zgadza sie";

i zawsze wychodzi "nie zgadza sie". Problem nie wystepuje gdy pod tymi zmiennymi mam liczby calkowite np 234
Zadne rzutowanie, set type itd nie pomaga, co to do cholery moze byc, ja juz nie mam sily na to, chyba jestem przemeczony...

bez podpisu

  1. hmm , Deus ex machine 14/11/07 20:36
    $a = '243.23';
    $b = 243.23;
    if ($a == $b) echo "rowne \n";

    i zawsze rowne

    a zobacz czy czasem nie masz w tej tablicy zapisu z przecinkiem zamiast kropki

    "Uti non Abuti"

    1. w tablicy jest kropka , PaKu 14/11/07 20:50
      ten problem jest dla mnie calkowita zagadka. Podejrzewam ze problem moze byc zwiazany z selectem z bazy danych, nie wiem moze cos z kodowaniem, moze cos z typem tej tabeli InnoDB, ale za chiny nie moge zlokalizowac tego problemu.

      przed ifem, gettype($ilosc1) pokazuje float a gettype($tabela['ilosc2']) string i rzutowanie tego drugiego na float tez nic nie daje. zalamac sie mozna

      bez podpisu

  2. liczby zmienno przecinkowe , Maners 14/11/07 20:45
    nie powinny byc bezposrednio porownywane (nie tylko w php, bo w .NET tez sie juz na to natkalem kiedy porownywalem dane wyciagniete z MS-SQL):

    http://us.php.net/...l/en/language.types.float.php - przeczytaj to co jest w tej rozowej ramce napisane.

    1. ooo chyba wlasnie o to chodzi. , PaKu 14/11/07 21:03
      Czyli wyglada na to ze do porownywania liczb zmiennoprzecinkowych powinienem uzywac funkcji bccomp, a nie zwyklego porownania. Super, jutro to wyprobuje, wielkie dzieki.

      bez podpisu

  3. lalala , DrLamok 14/11/07 21:17
    nie napisałem w zyciu ani jednej linijki kodu w php :P lol
    a jeśli już musze coś naskrobać to tylko w perlu

    ale...

    tuz przed sprawdzeniem warunku zrob sobie printout obu wartosci tak w celu sprawdzenia...

    --

    $a=$ilosc1
    $b=$tabela['ilosc2']
    print $a
    print $b

    tu sprawdzenie warunku czy $a=$b

    --- jak bryndza dalej to --

    $a = sprintf ("%.2f", $ilosc1 )
    $b = sprintf ("%.2f", $tabela['ilosc2'])
    print $a
    print $b

    tu warunek czy $a = $b

    ---

    sobie musisz przetrawić na swoje php ( blaaaa ... )

    1. wlasnie za kazdym razem , PaKu 14/11/07 21:45
      wyswietlaja sie te same wartosci, a w warunku wychodzi ze nie sa takie same. Wyprobuje jutro ta funkcje bccomp do liczb zmiennoprzecinkowych i zobaczmy co z tego wyjdzie, jak nie zadziala to chyba sie pochlastam ;)

      bez podpisu

  4. hmm , akustyk 14/11/07 22:23
    no dobra, a probowales najpierw na chama zrzutowac to na floata a potem dopiero porownywac?

    wzglednie, jeszcze bardziej chamsko (programisci C++ albo nie daj biosie Javy zamykaja oczy ;) ):
    if (sprintf(..., $zmienna1) == sprintf(..., $zmienna2))


    inna wizja: to moga byc liczby rzeczywiste o roznych podstawach i eksponentach, ale dajace ten sam wynik dla okreslonej dokladnosci. moze po prostu zalozyc, ze jest dokladnosc do ilus miejsc po przecinku, przemnozyc przez odpowiednia potege 10, zrzutowac na typ calkowity (longa albo chocby inta) i dopiero wtedy porownywac. czyli z grubsza to co robi bccomp :)

    binarna reprezentacja typow rzeczywistych jest bardzo problematyczna. nie raz i nie dwa natkniesz sie jeszcze na to, ze dwie pozornie rowne liczby nie sa sobie rowne :) pol biedy jak ci sie nie spieszy, ale jak kawalek softu jest "na wczoraj" to do 4 rano mozesz debugowac i sie rabac z uruchomieniem gada :D

    http://akustyk.magma-net.pl

    
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL