• 5 listopada 2025 12:01

    Używałem Python 3.13 i okazało się, że przy wielokrotnych operacjach dzielenia liczby typu int przez 100000 wynik był różny dla int() i //. Zarówno int() i // zwracają typ <class int> i zwracają część całkowitą dzielenia. Ale wygląda na to, że inaczej tracą precyzje. Więc, pewnie w zależności której wersji Pythona się używa, to przy obliczeniach na dużych liczba wyniki użycia int() i // mogą być różne. Nie znalazłem nic na ten temat w dokumentacji Pythona. Są tylko dyskusje na forach potwierdzające, te różnice.
    Może ktoś z was też spotkał się z tym przypadkiem i wie coś więcej na ten temat.

  • edit

    Nazwa tematu została zmieniona z int() vs //.

  • Członkowie 135 postów
    5 listopada 2025 13:08

    No niestety tak działa dzielenie całkowite w pythonie.

    Podziel:

    8.999999999999999 // 3

    oraz:

    8.9999999999999999 // 3

    dwa różne wyniki :)

  • 5 listopada 2025 17:26
    >>> 8.9999999999999999 / 3
    3.0
    >>> int(8.9999999999999999 / 3)
    3
    >>> 8.9999999999999999 // 3
    3.0
    
    >>> 8.999999999999999 / 3
    2.9999999999999996
    >>> int(8.999999999999999 / 3)
    2
    >>> 8.999999999999999 // 3
    2.0
    

    ma to sens, ale nie sadziłem że dwie operacje, niby te same, na tych samych wartościach będą dawać różny wynik. Może uda mi się znaleźć przypadek, w którym to nastąpiło, to podrzucę.

  • Członkowie 135 postów
    5 listopada 2025 17:36

    U mnie tak to wygląda:

    Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 8.999999999999999 // 3
    2.0
    >>> 8.9999999999999999 // 3
    3.0
  • 5 listopada 2025 20:26

    Chodzi mi o przypadek kiedy liczbę całkowitą dzieli się przez liczbę całkowitą a wynikiem jest liczba ułamkowa. To są przykłady u mnie na Pythonie 3.13

    x=-22793064
    x//100000 # -228
    int(x/100000) # -227
    
    y=-16236794
    y//100000 # -163
    int(y/100000) #-162
    
    z=16236794
    z//100000 # 162
    int(z/100000) # 162
    

    Po przeanalizowaniu więcej podobnych przypadków okazuje się, że problem jest tylko z liczbami ujemnymi. Dla liczb dodatnich obie wersje zwracają taki sam wynik.

    A to kolejna ciekawostka. Liczba jest dodatnia (duża) i dzielenie jest przez 1 - wynika dla int() i // jest różny :D

    x=2**64-1
    x         # 18446744073709551615
    int(x/1)  # 18446744073709551616
    x//1     # 18446744073709551615
    

    Znalazłem odpowiedź w dokumentacji Pythona docs.python.org/3/library/operator.html#mapping-operators-to-functions

    Ale dzielenie przez 1 to nie wiem dlaczego :)