![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witam,
napisałem sobie skrypcik w php listujący wg zadanych kryteriów (>, <, = itp)dane z bazy. Wszystko śmiga cacy, za wyjątkiem operatora '='. Potestowałem sobie w konsoli i zgłupiałem. wezmy takie zupelnie hipotetyczne zapytanie: select * from bilans where zzz=0.34; wynikiem zapytania empty set mimo, iż dobrze wiem, że w kolumnie zzz są takie właśnie wartości. Co ciekawe, zapytanie select * from bilans where zzz>0.33 and zzz<0.35; zwróci mi oczywiście wszystkie rekordy z wartością 0.34 właśnie. Typ kolumny to float, dane były konwertowane z pliku dbf, ale tam dane również były podawane z precyzją 2 miejsc po przecinku... Późno jest a ja jestem zmęczony ale chyba jeszcze do reszty nie zdurniałem? Spotkał się ktoś z podobnym problemem? Czym to jest spowodowane i co ważniejsze - jak to usunąć?? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Dane typu float/double NIE zawsze (a praktycznie nigdy) nie sa dokladnie takie na jakie wygladaja (google: system binarny ieee754) - dla tego 0.34 tak naprawde to 0.34000000001 albo cos podobnego.
Przekonwertuj je do typu decimal, albo porownuj z delta (czy x jest w przedziale > 0.34 - DELTA i < 0.34 + DELTA) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 358 Pomógł: 78 Dołączył: 4.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Po przekonwertowaniu pól na decimal porównywanie faktycznie działa. Dzięki!
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 16:22 |