Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sum() nie potrafi poprawnie zliczyć prostych liczb?
Forum PHP.pl > Forum > Bazy danych
bogunio
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
Crozin
Google: floating point precission loss

To Ci nigdy tak na prawdę nie działało poprawnie, teraz jedynie z jakiegoś powodu zmienił Ci się algorytm zaokrąglania przy wyświetlaniu liczby. Do przechowywania liczb rzeczywistych, z zachowaniem precyzji obliczeń powinieneś skorzystać z typu DECIMAL, nie FLOAT/DOUBLE.
bogunio
Dziękuję bardzo, już rozumiem w czym problem!

Ps. Kliknąłem gdzie trzeba smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.