Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]dziwny double
_krc_
post 23.11.2008, 15:05:27
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
bim2
post 23.11.2008, 15:13:38
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Probowałeś
echo (double)$liczba;

?


--------------------
Go to the top of the page
+Quote Post
_krc_
post 24.11.2008, 19:49:00
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

Ostrzeżenie: (0%)
-----


(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..

Ten post edytował _krc_ 24.11.2008, 19:52:10
Go to the top of the page
+Quote Post
bim2
post 24.11.2008, 20:55:30
Post #4





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Działa własnie, teraz zauważyłem, ale masz za dużą liczbe. :]


--------------------
Go to the top of the page
+Quote Post
_krc_
post 26.11.2008, 16:51:00
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

Ostrzeżenie: (0%)
-----


Nie bardzo wiem co znaczy za duża liczba..
Go to the top of the page
+Quote Post
erix
post 26.11.2008, 17:00:41
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




integer" title="Zobacz w manualu PHP" target="_manual


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
ddiceman
post 26.11.2008, 23:30:44
Post #7





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


  1. <?php
  2. printf('%.2f', $liczba);
  3. //albo:
  4. $znormalizowana = sprintf('%.2f', $liczba);
  5. ?>
Go to the top of the page
+Quote Post
_krc_
post 7.12.2008, 15:22:56
Post #8





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post
ddiceman
post 7.12.2008, 15:47:33
Post #9





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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

?
Go to the top of the page
+Quote Post
sowiq
post 7.12.2008, 16:06:45
Post #10





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował sowiq 7.12.2008, 16:58:33
Go to the top of the page
+Quote Post
ddiceman
post 7.12.2008, 16:57:04
Post #11





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
_krc_
post 8.12.2008, 15:11:24
Post #12





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 17.02.2006

Ostrzeżenie: (0%)
-----


Wiecej jak 14 miejsc po przecinku raczej nie bede potrzbowal. Takze to jest dobre rozwiazanie smile.gif Dzieki.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:31