• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błędne wyniki podczas działań - Python

0 głosów
826 wizyt
pytanie zadane 1 czerwca 2023 w Python przez wojtek_programista Nowicjusz (170 p.)

Cześć,

zacząłem swoją naukę Pythona. Chciałem napisać program, który wykonuje proste działania matematyczne(załączony kod) i moje pytanie jest następujące - dlaczego po wykonaniu działania 5.3 - 5.6 otrzymuję wynik -0.2999999999999998? Powinno być 0.3.

Pozdrawiam.

def oblicz(num1, znak, num2):
    if znak == "+":
        return num1 + num2
    elif znak == "-":
        return num1 - num2
    elif znak == "/":
        return num1 / num2
    return num1 * num2


number1 = float(input("podaj pierwszą liczbę: "))
znak1 = input("podaj operator: ")
number2 = float(input("podaj drugą liczbę: "))
print(oblicz(number1, znak1, number2))

 

1 odpowiedź

+1 głos
odpowiedź 1 czerwca 2023 przez adrian17 Mentor (355,180 p.)

Ponieważ zazwyczaj języki nie operują na dowolnych liczbach rzeczywistych, tylko na liczbach zmiennoprzecinkowych - które zajmują mało pamięci, ale nie mają idealnej precyzji; niektóre operacje albo nawet wartości nie da się zareprezentować z idealną precyzją.

Szczegóły i przykłady: https://0.30000000000000004.com/

Proponuję żebyś wypisał liczbę z zaokrągleniem do kilku liczb po przecinku, na przykład

'{:.2f}'.format(5.3 - 5.6) # -0.30

 

komentarz 1 czerwca 2023 przez wojtek_programista Nowicjusz (170 p.)
Dziękuję bardzo za odpowiedź, zapamiętam. Wcześniej używałem C++ i tam nie było takiego problemu.
2
komentarz 1 czerwca 2023 przez adrian17 Mentor (355,180 p.)

Gdzie tam, w C++ie jest taki sam problem :) Tylko po prostu domyślnie formatowanie zaokrągla liczbę. Gdybyś np spróbował ją porównać wynik odejmowania do -0.3, to też by Ci pokazał że są "różne".

komentarz 1 czerwca 2023 przez wojtek_programista Nowicjusz (170 p.)
O proszę, przez 4 lata nauki w liceum tego nie zauważyłem, a faktycznie tak jest. Dobrze wiedzieć.
2
komentarz 2 czerwca 2023 przez Oscar Nałogowiec (29,360 p.)
Bo to nie jest problem jednego czy drugiego języka, tylko komputerów jako takich. Zwykle programiści umieją zamieniać liczby pomiędzy różnymi systemami (dwójkomym, ósemkowym, dziesiętnym) ale ograniczone do liczb całkowitych (a czasami i naturalnych). Mało kto wchodzi w wartości ułamkowe. A tak okazuje się że często ułamek który w systemie dziesiętnym jest określnony na paru cyfrach po przecinku, w układzie dwójkowym ma nieskończone rozwinięcie (okresowe). A komputery nie mają nieskończonej liczby cyfr. 0.3 akurat takie jest. Po prostu twórcy biblioteki C przyjeli, by przy wypisywaniu liczb float zaokrąglić jest sensownie - tj na tyle na ile dokładne są te liczby.

Podobne pytania

0 głosów
1 odpowiedź 1,180 wizyt
0 głosów
2 odpowiedzi 1,017 wizyt
0 głosów
0 odpowiedzi 538 wizyt
pytanie zadane 29 stycznia 2023 w Python przez Kubas23 Użytkownik (630 p.)

93,733 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...