Jaką wartość zwróci funkcja zao zdefiniowana w języku C++, wywołana z argumentem 3.7?
int zao(float x){ return (x * 2); }
Poprawny wynik to 7. Funkcja mnoży argument przez 2, więc wyrażenie x * 2 daje 7.4. Typ zwracany zadeklarowano jednak jako int, dlatego przy instrukcji return wartość zmiennoprzecinkowa jest niejawnie konwertowana na liczbę całkowitą. Taka konwersja nie zaokrągla, tylko odcina część ułamkową, więc z 7.4 zostaje 7.
Do zapamiętania: konwersja float lub double na int obcina wynik w stronę zera, więc 7.9 też dałoby 7, a -7.9 dałoby -7. Jeśli funkcja ma zwracać ułamek, jej typ musi być zmiennoprzecinkowy, np. float zao(float x). Do zaokrąglania służy funkcja round() z biblioteki cmath.
Wynik 7.4 to poprawna wartość samego mnożenia, ale funkcja typu int nie może zwrócić części ułamkowej - przy zwracaniu zostanie ona odcięta. To najczęstszy błąd: obliczenie wyrażenia i pominięcie typu zwracanego, który stoi na samym początku definicji funkcji.
Wynik 8 dałoby zaokrąglenie w górę, a konwersja do int nie zaokrągla w górę, tylko obcina. Zresztą 7.4 nawet przy zwykłym zaokrąglaniu dałoby 7. Wynik 6 powstałby, gdyby argument przed mnożeniem obcięto do 3 - tak się jednak nie dzieje, bo parametr x jest typu float i przechowuje pełne 3.7. Analizując funkcję, warto przejść trzy kroki: jaki typ ma parametr, ile wynosi wyrażenie po return i do jakiego typu zostanie przekonwertowany wynik.
Takie obcinanie jest częstym źródłem błędów w programach liczących, np. ceny czy średnie ocen.