2012-02-06 9 views
6

Mam nadzieję, że to tylko krótkie pytanie. Mam kolumnę DECIMAL w mojej bazie danych. Wartość jest bardzo małą częścią dziesiętną - sumowanie tej wartości dla wszystkich wierszy wynosi 1.W jaki sposób należy używać typu PHP MySQL Decimal w php?

Teraz chciałbym użyć tej wartości w mojej aplikacji php, wyświetlić ją, wykonać obliczenia i zapisać ją ponownie Baza danych.

Jako że php ma tylko typy integer i float, jaki jest najlepszy sposób użycia tej wartości w php, aby nie stracić precyzji w obliczeniach lub wyświetlaniu?

  • przechowywać wartość jako ciąg i użyć BC Math do obliczeń
  • oddania liczby jako float - Wiem pływaki php są precyzyjne do sporej liczby (w zależności od systemu operacyjnego)
  • Konwersja wartości liczba całkowita za pomocą funkcji, która zapamiętuje wykładnik. Coś jeszcze?

Dzięki

+0

Trzymanie tego jako sznurka pozwoli zachować dokładność, ale gdy zaczniesz robić matematykę, wszystkie zakłady są wyłączone. –

+3

Użyłbym [BC Math] (http://www.php.net/manual/en/intro.bc.php) –

Odpowiedz

0

należy udać się do float aby nie stracić precyzji w obliczeniach i używać number_format wyjście do wyświetlania ...

Uwagi:
To naprawdę zależy od Twoich potrzeb i sposobu chcesz, aby twoje wyjście zostało załatwione, jeśli chcesz po prostu wyciąć mantysa po drugim numerze lub zaokrąglić.

Dzięki wykorzystaniu BC Math ze skalą 2 przykładowo 2.10/1.10 produkować 1.90 podczas korzystania number_format(2.10/1.10, 2) spowoduje 1.91 (zaokrąglenie wyników podobnie jak SELECT CAST(2.10/1.10 as DECIMAL(10,2)))

Aktualizacja:. Jak stwierdzono w komentarzach, mogą zdarzyć się, że stracisz precyzję w obliczeniach. Prawdopodobnie lepiej będzie wykonać obliczenia samokreślności w samym MySQL, więc możesz być pewien, że nic nie jest tracone podczas operacji matematycznych.

+0

Jakiekolwiek wyjaśnienie, na przykład dlaczego i co może się stać, jakie są plusy i minusy? –

+1

Jeśli @ Bendos chce arytmetycznie arytmetyki precyzyjnej, to używanie liczb zmiennoprzecinkowych nie jest dobrym pomysłem. Precyzja zostanie utracona, jeśli etap obliczeń obejmuje liczbę, która nie może być reprezentowana w formacie zmiennoprzecinkowym. – Hammerite

+0

@Hammerite, dzięki. Zaktualizowałem swoją odpowiedź, aby zauważyć ten –