2012-06-20 10 views

Odpowiedz

21

Dowolna z tych pomocy?

println(3.0/4.0) 
println(3.toDouble/4.toDouble) 
41

Jeśli wpisując numer, wystarczy wpisać co najmniej jeden z nich jako pływaka (zakładam znaczy Float nie Double):

println(3f/4) 

Jeśli masz już numery w zmiennych , konwersji co najmniej jeden z nich z toFloat

val x = 3 
println(x.toFloat/4) 

(W każdym razie, jeśli masz co najmniej jeden kompilator przeliczy drugi do Float do dopasowania.)

+3

Prawdopodobnie chcesz użyć podwójnego zamiast pływaka. –

6

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).

Powiązane problemy