Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PHP - Polecenie int nie liczy prawidłowo

11111olo 30 Sty 2016 14:22 519 6
  • #1 30 Sty 2016 14:22
    11111olo
    Poziom 43  

    Witam.
    Napisałem banalny program z użyciem polecenia int.

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Jak łatwo wywnioskować za każdym razem powinien być identyczny wynik. Jednak wygląda to tak:.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Dlaczego przy niektórych wartościach wydzielenie liczby całkowitej zmniejsza wynik o jeden, skoro za każdym razem wynosi on tyle samo czyli sto?

    0 6
  • Pomocny post
    #2 30 Sty 2016 15:56
    marcinj12
    Poziom 40  

    Bierz się to z dwóch powodów:
    - niedokładności, z jaką komputer reprezentuje liczby zmiennoprzecinkowe.
    - tego że dokonanie rzutowania na (int) polega na odcięciu części "po przecinku".

    Najlepiej widać to na przykładzie:

    Kod: php
    Zaloguj się, aby zobaczyć kod

    daje w wyniku:
    Code:
    a = 1.01 b = 1.5 c = 1.99
    
    (int)a = 1 (int)b = 1 (int)c = 1


    Jeśli chcesz uzyskać wynik całkowity, musisz użyć jednej z funkcji zaokrąglających:
    round(), ceil() lub floor(), w zależności od reguły, której chcesz użyć do zaokrąglenia, albo... zrezygnować z rzutowania na (int)

    0
  • #3 30 Sty 2016 16:05
    11111olo
    Poziom 43  

    Bo mi właśnie chodzi aby z liczby zmiennoprzecinkowej uzyskać liczbę całkowitą.
    Jak będzie 99.99999 to ma wyjść 99 a nie 100.
    Wychodzi na to, ze funkcja int jest napisana nieprawidłowo, więc skorzystam z twojej podpowiedzi.

    Z tych funkcji co podałeś to tylko floor się nadaje, lecz rezultat jest taki sam, czyli błędny.

    *******************
    Tak zawsze prawidłowo zadziała.

    Kod: php
    Zaloguj się, aby zobaczyć kod

    0
  • #4 30 Sty 2016 17:47
    rufek90
    Poziom 24  

    11111olo napisał:

    Wychodzi na to, ze funkcja int jest napisana nieprawidłowo


    Jak wspomniał marcinj12, to wiąże się z niedokładnością reprezentacji liczb przez komputer. Rzutowanie nie ma nic do tego.

    Jak chcesz podrążyć temat to zamień linię:
    $a = $x / 100;
    na
    $a = $x * 0.01;

    Powinno być tak samo, prawda? Jednak pojawi się kilka linijek więcej, gdy c != b

    PHP - Polecenie int nie liczy prawidłowo

    0
  • #5 30 Sty 2016 18:15
    11111olo
    Poziom 43  

    Tak czytam co napisaliście i chyba się nie zrozumieliśmy.
    Jak to możliwe, że za każdym razem zmienna $b = 100 to zmienna $c przyjmuje dwie wartości.
    Akurat w podanym przykładzie dzielenie jest zawsze przez 100 co daje dokładny wynik w postaci dziesiętnej, wiec nie może być mowy o niedokładności obliczeń.
    Następnie liczba całkowita w tym przykładzie jest zawsze 100 razy większa od tej podzielonej.
    Wychodzi na to, że matematyczne 100 wcale nie wynosi 100.
    To ile wynosi zmienna $b, gdy poddana funkcji int zmienna $c wynosi 99?

    0
  • Pomocny post
    #6 30 Sty 2016 18:24
    rufek90
    Poziom 24  

    Chodzi o to, że komputer musi zapisać liczbę dziesiętną w pewnej skończonej liczbie zer i jedynek, co nie zawsze jest możliwe, więc występują zaokrąglenia. Przy mnożeniu i dzieleniu tak zaokrąglonych liczb tracisz coraz więcej precyzji, stąd rozbieżności. Poprawcie mnie, jeżeli się mylę :)

    Edit: Co do pytania o zmienną:
    Twoje b wynosi czasem na przykład 99.99999991023, a czasem 100.000000231 (podaję jakieś wartości od czapy, żeby zobrazować problem, to nie są dokładne wartości)

    0
  • #7 30 Sty 2016 18:38
    11111olo
    Poziom 43  

    Czyli wyświetlenie polega na zaokrągleniu wartości, szkoda, że wykonanie czegoś tak łatwego tak zagmatwano.

    0