Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]dziwny double
Forum PHP.pl > Forum > Przedszkole
_krc_
Witam,

Problem wygląda tak:

W bazie danych chcę przechowywać i odczytywać pewien współczynnik, więc zapisuje go jako:
  1. `rate` decimal(14,10) UNSIGNED NOT NULL


Przy odczytaniu tych współczynników, chcę aby były one pokazane w notacji dziesiętnej , ale bez zbędnych zer na końcu. Dla przykładu mam cztery liczby w tabeli:

1.0000000000
0.0000900000
0.0009000000
1.0000000090

Kiedy odczytuje je normalnie (bez rzutowania) to są one pokazane jako string, czyli niezbyt ładnie,
wolałbym, aby te zera po prawej stronie zostały obcięte, czyli:

1
0.00009
0.0009
1.000000009

Niestety kombinuje jak mogę i niczego nie wskórałem. Za to ciekawie to wygląda po dodaniu liczby 0 do każdej wartości, wtedy typ zmienia się na double ale z małymi różnicami:

1
9.0E-5
0.0009
1.000000009

Czyli jakby lepiej oprócz tego 9.0E-5, czyli od 5 pozycji dziesiętnej zaczyna mi dodawać eksponent, co ciekawe jeśli częścią całkowitą jest liczba różna od zera pokazuje ją w postaci dziesiętnej.
Nie ma jakiegoś sposobu aby wszystkie liczby były pokazane w notacji dziesiętnej, przy użyciu jednej prostej funkcji lub rzutowania?


Z góry dziękuję za pomoc
bim2
Probowałeś
echo (double)$liczba;

?
_krc_
(double) daje ten sam efekt co dodanie zera (co automatycznie zmienia liczbę na double) czyli taki:

1
9.0E-5
0.0009
1.000000009

W sumie poradziłem sobie z tym problemem przez ucinanie zer z prawej, takie rozwiązanie proponowali na php.net, mimo to ciekawi mnie czemu to rzutowanie nie działa tak samo na wszystkich liczbach..
bim2
Działa własnie, teraz zauważyłem, ale masz za dużą liczbe. :]
_krc_
Nie bardzo wiem co znaczy za duża liczba..
ddiceman
  1. <?php
  2. printf('%.2f', $liczba);
  3. //albo:
  4. $znormalizowana = sprintf('%.2f', $liczba);
  5. ?>
_krc_
@ddiceman:

Twoj sposob ogranicza mi wyswietlana liczbe do dwoch zer po przecinku a ja chce widziec wszystkie liczby ktore znajduja sie po przecinku, oczywiscie bez zbednych zer po prawej stronie. Widze ze nie ma prostego rozwiazania, poza stworzeniem funkcji ucinejace te zera..

W kazdym razie dziekuje za zainteresowanie.

Pozdrawiam
ddiceman
a zwykle
  1. <?php
  2. printf('%f', $liczba);
  3. //albo:
  4. $znormalizowana = sprintf('%f', $liczba);
  5. ?>

?
sowiq
Jak dla mnie kod, który podałeś jest równoznaczny z:
  1. <?php
  2. echo (double)$liczba;
  3. ?>


[edit]
~ddiceman ma rację w poście poniżej smile.gif
ddiceman
sowiq:
nie do konca, bo dla malych liczb Twoj zapis wydrukuje notacje naukowa a moj zawsze dziesietna. Faktem jest, ze nie rozwiaze problemu, bo jest to zalezne od precyzji liczb, ale juz cos takiego tak:
  1. <?php
  2. echo rtrim(sprintf('%10.14f', $a), '0');
  3. ?>

Sprawdz:
  1. <?php
  2. $a = 0.000000000001000000;
  3. echo (double)$a;
  4. echo '<br>#######<br>';
  5. echo rtrim(sprintf('%10.14f', $a), '0');
  6. ?>
_krc_
Wiecej jak 14 miejsc po przecinku raczej nie bede potrzbowal. Takze to jest dobre rozwiazanie smile.gif Dzieki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.