Struktūrinis programavimas
Pamoka 6 / 11 Duomenų tipai giliau ~35 min
2 / 4 📖 Teorija

Dalybos spąstai — 0% perskaitytos knygos

Dabar — klaida, kuri neatrodo kaip klaida. Tarkim, perskaitei 190 puslapių iš 380 ir nori pažangos procentais:

progress := it.PagesRead / it.Pages * 100
fmt.Println("Progress:", progress, "%")

Rezultatas:

Progress: 0 %

Nulis procentų. Pusę knygos perskaitei, o programa sako 0 — ir jokios klaidos, jokio įspėjimo. Kodėl? PagesRead ir Pages — abu int, o int dalyba meta liekaną: 190 / 380 = 0 (sveikoji dalis), tada 0 * 100 = 0. Programa suskaičiavo „teisingai" — pagal int taisykles.

Vaistas — aiškus konvertavimas į float64 PRIEŠ dalybą:

progress := float64(it.PagesRead) / float64(it.Pages) * 100
fmt.Printf("Progress: %.1f%%\n", progress)
Progress: 50.0%

Go niekada nekonvertuoja tipų tyliaiint netaps float64 pats. Tai atrodo pedantiška, bet būtent todėl klaida visada matoma kode: kur nėra float64(...), ten dalyba sveikoji.

Trumpai apie simbolius: string viduje gyvena baitai; rune — vienas Unicode simbolis. len("ąžuolas") grąžina baitus (9), ne raides (7) — lietuviškos raidės užima po 2 baitus. Jei kada skaičiuosi raides — len([]rune(s)).

Spąstai. Int dalybos klaida pavojinga tuo, kad tyli: išlaidų vidurkis, reitingo vidurkis, procentai — visi „veikia", tik rodo neteisingą atsakymą. Taisyklė: pamačius / paklausk savęs — ar man čia reikia liekanos atmetimo? Jei ne, konvertuok į float64 prieš dalybą (ne po: float64(a/b) jau per vėlu — dalyba įvyko int pasaulyje).