Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] błędy przy dodawaniu liczb ułamkowych
timon27
post
Post #1





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


Typy float są zapisane binarnie i powoduje to błędy.
Można się zdziwić wynikiem:
  1. $x=0.1;
  2. $y=$x+$x+$x;
  3. echo $y;//0.3
  4. if ($y==0.3) echo 'równe';//nie wyświetla


Pytanko: czy istnieje jakiś sposób oprócz roundów na poprawne wyniki?

Abstrahując od tego że roundy nie zawsze pomagają...
Dla przykładu gdy ustawie precyzję 15 to warunek:
  1. if (round($y,15)==0.3) echo 'równe';//wyświetla się

bedzie już poprawny. Jednak błędy się akumulują i znowu błąd w:
  1. if (round($y+$y+$y+$y+$y+$y+$y,15)==2.1) echo 'równe';//nie wyświetla się


Może jakaś klasa/typ decimal?

Ten post edytował timon27 6.12.2013, 21:15:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
irmidjusz
post
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


a http://php.net/manual/pl/book.bc.php znasz?
Go to the top of the page
+Quote Post
timon27
post
Post #3





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


Już tak (IMG:style_emoticons/default/smile.gif)
Wygląda na to o co mi chodziło.

Kod już zwraca poprawne wyniki:
  1. $f=bcadd($y,$y,15);
  2. $f=bcadd($f,$y,15);
  3. $f=bcadd($f,$y,15);
  4. $f=bcadd($f,$y,15);
  5. $f=bcadd($f,$y,15);
  6. $f=bcadd($f,$y,15);
  7. if ($f==2.1) echo 'równe'; //wyświetla się


Wiadomo że takie sytuacje rzadko się zdarzają i można je inaczej rozwiązać., jednak dobrze wiedzieć o tej klasie. Może się przydać.
Go to the top of the page
+Quote Post

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: 4.10.2025 - 10:59