2015-05-25 14 views
11

Mam następujące zapytanie SQL.Nieprawidłowe wartości dziesiętne pojawiające się w SUM MySQL

SELECT SUM(final_insurance_total) as total 
FROM `leads` 
GROUP BY leads.status 

że ma jeden wiersz danych w głównej tablicy z wartością final_insurance_total do 458796. Typ danych final_insurance_total jest float.

Z jakiegoś powodu MySQL podsumowuje pojedynczy wiersz jako "458796.375".

Gdybym zmienić zapytanie do

SELECT (final_insurance_total) as total 
FROM `leads` 
GROUP BY leads.status 

prawidłowa wartość jest zwracana. Co się dzieje w świecie?

+0

http://bugs.mysql.com/bug.php?id=1961 –

+0

Simular problem tutaj http://stackoverflow.com/questions/3907021/using-sum-on-float-data –

+3

Oto dobry wyjaśnienie https://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – Stan

Odpowiedz

0

FLOAT nie gwarantuje precyzji w przypadku jakichkolwiek obliczeń. Jeśli użyjesz prostego SELECT, nie zostaną wykonane obliczenia, więc otrzymasz oryginalną wartość. Ale jeśli użyjesz SUM(), nawet z jednym wierszem zostanie wykonane przynajmniej jedno dodanie (0 + current_value).

Czy naprawdę potrzebujesz FLOAT? Na przykład, jeśli masz 2 cyfry dziesiętne, możesz użyć wartości INT i pomnożyć wszystkie wartości przez 100 przed wszystkimi INSERT s. Kiedy SELECT ing wyników, można podzielić przez 100.

1

The FLOAT i DOUBLE typów w MySQL (jak również w innych bazach danych i czasy pracy języka programowania) są reprezentowane w sposób szczególny, co prowadzi do wartości przechowywanych samopoczucie przybliżeń, nie dokładne wartości. Zobacz MySQL docs, a także general information on floating-point arithmetics.

Aby przechowywać i obsługiwać z dokładnymi wartościami, należy użyć typu DECIMAL (patrz:).

EDIT: mam przeprowadzić kilka testów, a jednocześnie zmiennoprzecinkowe precyzyjne błędy są dość powszechne, szczególnie ten jeden wydaje się być specyficzna dla realizacji SUM() w MySQL. Innymi słowy, jest to błąd, który istnieje tam od dłuższego czasu. W każdym przypadku powinieneś użyć DECIMAL jako swojego typu pola.

0

Jeśli użytkownik nie jest sysadmin i nie może zmienić typu danych pola, takiego jak FLOAT, użytkownik może użyć CAST w celu uzyskania pożądanego wyniku.

Powiązane problemy