Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zamiast spodziwanego 0 mam 2.7755575615629E-17
Forum PHP.pl > Forum > Przedszkole
Esper
mam taką pętlę jak poniżej, spodziewałem się, że będzie zwracać same wartości z dokładnością do jednego miejsca po przecinku a tu zamiast zera mam 2.7755575615629E-17 co nie jest jednoznaczne z zerem. Z czego to wynika?
  1. $t=0.2;
  2. $energy_1 = 0;
  3. $energy_2 = 0;
  4. $cooldown_1 = 0;
  5. $cooldown_2 = 0;
  6. $charge_cooldown_1 = 3.3;
  7. $fast_energy_1 = 5;
  8. $fast_cooldown_1 = 0.5;
  9. while ($t<0.7){
  10. print "t przed ifami : $t cooldown_1: $cooldown_1</br></br>";
  11. if ($cooldown_1 <= 0.01) {
  12. if ($charge_energy_1 >= 100) {
  13. $cooldown_1 = $cooldown_1 + $charge_cooldown_1;
  14. }
  15. else {
  16. $cooldown_1 = $cooldown_1 + $fast_cooldown_1;
  17. $energy_1 = $charge_energy_1 + $fast_energy_1;
  18. }
  19. }
  20. $t=$t+0.1;
  21. $cooldown_1 = $cooldown_1-0.1;
  22. print "t: $t cooldown_1: $cooldown_1</br></br>";
  23. }


zwraca mi to następujące dane

t przed ifami : 0.2 cooldown_1: 0
t: 0.3 cooldown_1: 0.4
t przed ifami : 0.3 cooldown_1: 0.4
t: 0.4 cooldown_1: 0.3
t przed ifami : 0.4 cooldown_1: 0.3
t: 0.5 cooldown_1: 0.2
t przed ifami : 0.5 cooldown_1: 0.2
t: 0.6 cooldown_1: 0.1
t przed ifami : 0.6 cooldown_1: 0.1
t: 0.7 cooldown_1: 2.7755575615629E-17
poli25
spróbuj wszystkie dodawane wartości zaokrąglić funkcją round() np. round(cooldown_1 + $fast_cooldown_1,2)
Esper
pomogło, ale czy to tak się powinno zawsze odbywać? liczyłem, że w przypadku takich operacji nie ma co myśleć o błędach związanych z dokładnością...
batman
Tutaj masz to ładnie wyjaśnione - https://secure.php.net/manual/en/language.types.float.php
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.