• 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

VPS Starter Arubacloud
0 głosów
312 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 Ekspert (348,220 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 Ekspert (348,220 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,320 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ź 579 wizyt
0 głosów
0 odpowiedzi 329 wizyt
pytanie zadane 29 stycznia 2023 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
1 odpowiedź 560 wizyt
pytanie zadane 6 listopada 2022 w Python przez Matlane Użytkownik (560 p.)

92,838 zapytań

141,780 odpowiedzi

320,842 komentarzy

62,170 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...