2014-12-17 12 views
5

Powszechne problemy, które wyszukiwałam i czytałam i nadal utknąłem.Wybierz zmiennoprzecinkowe z MySQL z poprawną precyzją

Mam tabelę z transakcjami, w których cena handlowa jest zadeklarowana jako zmienna. Nie mogę użyć "dziesiętnego", ponieważ różne zapasy mają inną precyzję w ich cenie.

Jeśli spojrzeć na tabelę za pomocą phpMyAdmina, wszystkie liczby wyglądają poprawnie - tak jak zostały wstawione, jak widać na poniższym zrzucie ekranu, cena (p) wynosi 0,709, co jest poprawne.

enter image description here

Kiedy jednak zaznaczyć, że handel z tabeli za pomocą regularnych Zend Framework, otrzymuję cena, która jest 0,70899999141693

Jak mogę zrobić select, która działa tak samo jak MyAdmin wybrać robi? A otrzymasz numer z właściwą precyzją? Jeśli mójAdmin wykonuje to zadanie, może być również dostępny w zend, czy mam rację:?

EDYCJA: Nie mogę użyć ROUND i nie mogę używać DECIMAL, ponieważ nie znam prawidłowej precyzji. np. cena Apple ma 2 dziesiętne w precyzji, ale cena VTB Bank ma 6 dziesiętnych w precyzji

EDIT2: Oto więcej przykładów na ten sam wybór w myAdmin i Zend.

Handel 8838397 dokonano w cenie 0,01156. Mam włożeniu go w bazie danych i to, co mam w MyAdmin:

enter image description here

Jeśli wybiorę go z php, otrzymuję to:

enter image description here

Zakładam, MyAdmin jakoś domysłów precyzja i robi to naprawdę dobrze. W jaki sposób???

+1

Dlaczego nie użyć dziesiętnej dokładności (lub skali) wystarczająco wysokiej, aby poradzić sobie w najgorszym przypadku? – Strawberry

+0

Tricky thing .. tak działa MySQL. Im wyższa liczba, tym mniej precyzyjne będą twoje obliczenia przy korzystaniu z typów FLOAT | DECIMAL. Typ pola DECIMAL może być twoim rozwiązaniem, ale już napisałeś, że nie możesz go użyć. – Benz

+0

Czy kolumna p jest zawsze liczbą mniejszą od 0? – Benz

Odpowiedz

0

Można użyć round funkcję:

select round(p, 3) as p from table_name; 
+0

Nie mogę, bo nie wiem, precyzja - dla każdego z nich jest inaczej –

+0

Kto wie wtedy dokładność? Gdzie są informacje na ten temat? Musisz go znać, aby go wybrać. Jeśli jest inny dla każdego zasobu - skąd o tym wiesz? – Nebril

+0

Po otrzymaniu transakcji z wymiany, ma ona dokładność znana i prawidłowa. Wstawiam go do mySql i luźną precyzję. W porządku, ale myAdmin jakoś ** wie ** jak zaokrąglić każdą liczbę. Pytanie brzmi - jak? –

1

Cytat „Mam tabeli z transakcji, w których cena towarowy jest zadeklarowane jako pływaka cant” stosowanie po przecinku, ponieważ różne akcje mają różną dokładność w ich cenie.”

Podejrzewam, że to nonsens. Jeśli chcesz dokładnych danych, użyj precyzyjnego typu. Stosowałbyś tylko float, jeśli wartości przekraczały zakres oferty DECIMAL, co nie ma miejsca w tym przypadku. DECIMAL (65,30) obsługuje wartości do 30 cyfrowych miejsc. To powinno wystarczyć dla wszystkich twoich wartości.

Przypuszczam, że mieszacie pamięć wewnętrzną z wyświetlaniem danych tutaj.Jeżeli liczba miejsc po przecinku jest niezbędne informacje, a następnie przechowywać te informacje:

 
trade_id office price precision 
12345678 123456 0,709 4 

Zapytanie:

select trade_id, office, round(price, precision) as price 
from trades; 

Wynik:

 
trade_id office price 
12345678 123456 0,7090 

EDIT: Co do „MyAdmin jakoś już rozwiązany, po prostu nie mogę podać, jak ":

Nie robi. Wątpię, aby wyświetlał 0.120 dla wprowadzonego 0.120 i 0.12000 dla wprowadzonego 0.12000. DBMS przechowuje tę samą wartość float dla obu i phpMyAdmin nie ma możliwości poinformowania, że ​​mają być traktowane inaczej. Jedyne, co prawdopodobnie robi phpMyAdmin to zaokrąglenie do maksymalnej liczby miejsc dziesiętnych, powiedzmy, że 6. select round(0.70899999141693 , 6) daje 0.709.

+0

Nie dbam o precyzję wewnętrznie, ma to znaczenie tylko wtedy, gdy wyświetlam transakcje klientowi. Php MyAdmin ** może ** wyświetlać moją tabelę bez żadnych dodatkowych kolumn i bałaganu z zaznaczeniami (co spowolni bazę danych). Oto zrzut ekranu z MyAdmin, kiedy przeglądam tabelę transakcji. Jak widać, wszystkie liczby wyświetlane z właściwą precyzją ... http: //take.ms/uFKvq –

+0

Zobacz moją zmienioną odpowiedź na pytanie, co prawdopodobnie robi phpMyAdmin. –

+0

0.70899999141693 myAdmin zaokrągla do 0.709, ale 0,011559999547899 zaokrągla do 0.01156. I oba numery ** są ** poprawne. –