Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] błędy przy dodawaniu liczb ułamkowych
timon27
post 6.12.2013, 21:08:15
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
irmidjusz
post 6.12.2013, 21:21:15
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?


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
timon27
post 6.12.2013, 21:41:13
Post #3





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

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


Już tak 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 15:47