Dla typów pierwotnych (Int, Float, Double itp.), Scala przestrzega reguł w Javie.
Jeśli napiszesz liczby całkowite 3, 4 itd., Ich wyrażenia pozostaną jako liczby całkowite. Więc
println(3/4)
ma wyraz składający się z dwóch liczb całkowitych, więc wynik jest liczbą całkowitą: 0.
Jeżeli którykolwiek z wartościami dzieje się float zamiast Int cała ekspresja rozszerza się, aby stać się Pływak. To samo dotyczy Double. To rozszerzenie dzieje się niemal całkowicie automatycznie - wystarczy podać kompilatorowi wskazówkę, co chcesz, np.
println(3f/4)
rozszerza się unosić i
println(3.0/4)
rozszerza się podwoić.
Korzystając z tych funkcji językowych w programach rzeczywistych, należy zawsze pomyśleć o utracie precyzji, która może wystąpić. Zauważyłeś już podział całkowity powodujący utratę ułamka dziesiętnego w tym przypadku. Ale jest inna sprawa dla zmiennoprzecinkowych, które ilustrują tutaj:
println(4f/3)
Rzeczywisty wynik jest utrzymywany w binarnej reprezentacji (przy użyciu standardu IEEE 754), która ma frakcji binarne, frakcje nie po przecinku, a więc nie jest w stanie utrzymać 4f/3 bez małego błędu.
scala> println(100f/99f * 99)
99.99999
Mogłeś oczekiwać, że wydrukuje 100. Czasami to nie ma znaczenia, a czasami tak jest. Jednym z bardzo częstych przypadków, w których liczy się bardzo dużo, jest postępowanie z wartościami pieniężnymi. Zasadą jest ZAWSZE UNIKAĆ float i double for money: zamiast tego użyj BigDecimal lub po prostu trzymaj liczbę pensów jako Long, lub czasem uciekaj do Strings (które dobrze grają z BigDecimal pod warunkiem, że nie są one analizowane jako Double wartości na droga).
Prawdopodobnie chcesz użyć podwójnego zamiast pływaka. –