Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sum() nie potrafi poprawnie dodać prostych liczb?
#1
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.
Odpowiedz
#2
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.
http://webmaster.na6.waw.pl
Odpowiedz
#3
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!
Odpowiedz
#4
No właśnie. Kompletnie zapomniałem o DECIMAL.
http://webmaster.na6.waw.pl
Odpowiedz


Podobne wątki…
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  zaokraglanie liczb z rekordu Intelactive 6 4,759 12-11-2012, 02:59
Ostatni post: Engine
  Automatyczne zaokrąglanie liczb michalszyd 2 2,769 19-10-2012, 23:52
Ostatni post: camelrafal
  Przypisanie liter do konkretnych liczb Pioter 2 3,100 28-07-2011, 05:02
Ostatni post: Pioter
  Czy można jakoś dodać klase lub id do <a> [php] kamil133 6 5,581 05-06-2011, 23:46
Ostatni post: kamil133
  [mysql] jak poprawnie importować dane z plików do tabel? yaroszka 3 3,391 09-05-2011, 21:40
Ostatni post: kancik

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości
Sponsorzy i przyjaciele
SeoHost.pl