TwojePC.pl © 2001 - 2024
|
|
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 - 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" - 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 moznabez podpisu
- 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.- 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
- 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 ... )- 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
- 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 :Dhttp://akustyk.magma-net.pl |
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|