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
 
 » Menah 12:19
 » Matti 12:19
 » PeKa 12:14
 » CiAsTeK 12:12
 » Syzyf 12:11
 » burz 11:59
 » AdiQ 11:58
 » Dexter 11:57
 » 247 11:57
 » Kenny 11:44
 » Master/Pe 11:43
 » Liu CAs 11:35
 » resmedia 11:34
 » Fight 11:31
 » Ament 11:30
 » malyy 11:30
 » abes99 11:28
 » Markizy 11:24
 » KHot 11:23
 » Tomasz 11:18

 Dzisiaj przeczytano
 65767 postów,
 wczoraj 55205

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2026
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-2026, TwojePC.PL