![]() |
Sum() nie potrafi poprawnie dodać prostych liczb? - Wersja do druku +- Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów (https://www.webmastertalk.pl) +-- Dział: Technologie internetowe - tworzenie stron WWW (https://www.webmastertalk.pl/forum-technologie-internetowe-tworzenie-stron-www) +--- Dział: Programowanie, Bazy danych (https://www.webmastertalk.pl/forum-programowanie-bazy-danych) +--- Wątek: Sum() nie potrafi poprawnie dodać prostych liczb? (/thread-sum-nie-potrafi-poprawnie-dodac-prostych-liczb) |
Sum() nie potrafi poprawnie dodać prostych liczb? - bogunio - 13-11-2012 Witam i proszę o pomoc bo zdębiałem. Od lat używam w firmie aplikacji php/mysql, która chodziła bezbłędnie aż do czasu ostatniej aktualizacji linuxa i przy okazji MySql'a do 5.5 Mam tabelę w której w kolumnie 'netto' zapisują się liczby z dokładnością do 0.1. Używam formularza dzięki któremu mogę zliczyć ilość zakupionego towaru za podany okres czasu (data od-do). Zapytanie wygląda tak: select sum(netto) from kolory where kind = 'towar' and date >= '$from' and date <= '$to'; Ponieważ owo sumowanie zaczęło wyglądać dziwnie gdyż suma liczb z dokładnością do 0.1 (która jest ilością w kg zakupionego towaru) z całego miesiąca dała taki wynik: 97.89999999999999 Zacząłem badać sprawę zadając to zapytanie od początku miesiąca dodając za każdym razem jeden dzień. Oto wyniki: Dla zakresu od 1-go do 28-go mamy wynik normalny czyli sum działa dobrze i mamy liczbę z jednym miejscem po przecinku: 96.6 Dla zakresu od 1-go do 29-go już: 97.89999999999999 Tylko dla daty 29-go to: 1.3 Dlaczego dodatnie do 96.6 prostej liczby 1.3 nie dało po prostu wyniku 97.9? Dla innych towarów też występuje ten błąd choć dane są inne i nie potrafię dostrzec żadnej prawidłowości. Po prostu w pewnym momencie wynik to cyfra mająca 14 miejsc po przecinku, co przy innych obliczeniach generuje już błędy. Bardzo proszę o pomoc. RE: Sum() nie potrafi poprawnie dodać prostych liczb? - andrzejhi - 14-11-2012 Ja się z czymś takim nie spotkałem ale myślę że to nie jest kwestia liczby 1.3 tylko ilości sumowanych liczb. Czy sprawdzałeś dodanie liczb z zakresu 5-29? Pewnie ta suma też będzie ok. Jakiego typu są te liczby? Sądze że jest to problem jaki się może pojawiać przy dodawaniu liczb zmiennoprzecinkowych. Dziwne że jest taki problem z nowej wersji MySQL. Tu masz odpowiedź: http://dev.mysql.com/doc/refman/5.5/en//problems-with-float.html http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html Spróbuj tak: SELECT ROUND(SUM(netto)) FROM kolory WHERE kind = 'towar' AND date >= '$from' AND date <= '$to'; zaokrągli to wyniki ale bądź ostrożny i dobrze przetestuj bo nie jestem pewien czy się nie pojawi błąd. RE: Sum() nie potrafi poprawnie dodać prostych liczb? - bogunio - 16-11-2012 Dziękuję za odpowiedź. Problem rozwiązany. W programach związanych z księgowością, by nie powstawały takie kwiatki, kolumnę trzeba definiować jako DECIMAL. To rozwiązało problem ostatecznie. Pozdrawiam! RE: Sum() nie potrafi poprawnie dodać prostych liczb? - andrzejhi - 16-11-2012 No właśnie. Kompletnie zapomniałem o DECIMAL. |