Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> php kilejność działań, Dlaczego PHP nie umie liczyć?
mimol
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Witam, niedawno miałem problem związany z tym, że PHP nie umie liczyć.
Mógłby ktoś wytłumaczyć mi na czym polega problem?
Wiem, że to ma związek z floating point i precyzją, ale to są PROSTE działania, max 3 miejsca po przecinku...
Załóżmy że mam taki kod
  1. $price = 24.5;
  2. $discountPrice = 7.35;
  3. $discount = $price - $discountPrice;
  4.  
  5.  
  6. $offerValue = 100 * $discount / $price;
  7. var_dump($offerValue); // zwraca ładnie 70
  8. var_dump((int)$offerValue); // zwraca 69 tutaj magia...
  9.  
  10. //idzemy więc dalej
  11. $offerValue = 100 * ($discount / $price);
  12. var_dump((int)$offerValue); // zwraca 70, zmiana kolejności wykonywania działań,


Proszę o podanie jakiegoś powodu dlaczego
  1. //discount / price = 0.7
  2. echo (int)(100 * ($discount / $price)); //70
  3. echo (int)(100 * $discount / $price); //69
  4. echo (int)($discount / $price * 100); //70


ew jak wyświetlić prawdziwą wartość $discount / $price (powinno być 0.7) a pewnie jest (6.9999999999999999999),
Oczywiście poradziłem sobie używając bcmath

Ten post edytował mimol 31.12.2013, 19:10:34
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Wiem, że to ma związek z floating point i precyzją, ale to są PROSTE działania, max 3 miejsca po przecinku...
Nie chodzi o liczbę cyfr po przecinku, a o możliwość ich zapisania bez utraty dokładności. I tak 0,1 zostanie zapisane z utratą danych, a 0,5 zostanie zapisane bez utraty danych mimo iż obie mają ledwie jedną cyfrę po przecinku.
Zmiana kolejności wykonywania działań sprawia, że inna ilość danych jest tracona na innym etapie co ma wpływ na końcowy wynik.
Cytat
Oczywiście poradziłem sobie używając bcmath
Niepotrzebnie zaprzęgasz tutaj BC Math, skorzystaj ze zwykłego round.

Ten post edytował Crozin 1.01.2014, 23:48:49
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 12.10.2025 - 12:48