2012-07-24 17 views
6

Piszę skrypt PHP, który wygląda przez tabeli DB wartości float, które wydają się być nieco małe, takie jak:Dlaczego MySQL zwraca niektóre zmienne w notacji naukowej, ale nie inne?

0.00052 
0.00134 
0.00103 
0.00149 
0.00085 
0.00068 
0.00077 
0.00088 
0.00169 
0.00063 

Dla nieznanych mi przyczyn, niektóre wartości są wyświetlane w dB naukowe notacja, takich jak:

1.12305e-06

stół ustawiony jest na float, a próbowałem wszelkiego rodzaju funkcji w PHP, aby wymusić numery w celu wyświetlenia jako przecinku, bezskutecznie. Spróbuj, jak mogę, nie mogę uzyskać tej tabeli liczb, aby konsekwentnie dziesiętne we wszystkich przypadkach.

Wszelkie sugestie, jak rozwiązać ten problem? Próbowałem typcasting do (float) i używając number_format() i kilku innych opcji, ale bez zmian za każdym razem.

+0

Not sure off the top of my head, ale czy wartości wyświetlania MySQL w notacji naukowej? Wiem, że PHP na pewno. Czy możesz pokazać bardziej kompletny przypadek testowy, w jaki sposób radzisz sobie z tymi wartościami? – deceze

+2

w jaki sposób pokazują, że są w tym formacie? Czy to jest mysql, który zwraca je w ten sposób, czy jest to po prostu reprezentacja php? używasz 'var_dump',' echo', 'print', etc? – Nanne

+1

Jakiś powód, dla którego nie używasz typu danych "DECIMAL"? – Romain

Odpowiedz

2

Wydaje się, że istnieje sześć cyfr limitu na to, co jest wyświetlane z CLI (i prawdopodobnie w innym miejscu). Przykład: 1.12305e-06, który jest 0.00000112305, który zostanie pokazany jako 0.00000 - choć oczywiście nie jest równy zeru.

Jeśli upierasz się przy używaniu pływaków lub podwójnych, będziesz musiał je wymusić używając czegoś w rodzaju round(columnName,5), aby wymusić wyświetlanie wartości dziesiętnej. W przeciwnym razie może przełączyć się na typ danych o wartościach dziesiętnych.

Od http://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html

Ponieważ wartości zmiennoprzecinkowe są przybliżone i nie są przechowywane jako dokładnych wartości, stara się traktować je jako dokładny w porównaniach może prowadzić do problemów. Są również zależne od zależności platformy lub implementacji. Aby uzyskać więcej informacji, zobacz Rozdział C.5.5.8, "Problems with Floating-Point Values"

Zobacz także ten numer thread na forach mysql dotyczących tego problemu.

0

Rozwiązanie w moim przypadku zmieniło się z pływającego na dziesiętne w bazie danych, więc dzięki Romainowi za komentarz, który skłonił mnie do przyjrzenia się temu rozwiązaniu!

Powiązane problemy