2012-06-20 41 views

回答

21

以上都有幫助嗎?

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

如果你輸入的號碼,只需鍵入其中至少有一個爲float(我假定你的意思FloatDouble):

println(3f/4) 

如果你已經在變量的數字,將它們轉換中的至少一個與toFloat

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

(在每種情況下,如果有至少一個,編譯器將其他轉換成Float匹配。)

+3

你可能想要使用double而不是float。 –

6

對於原始類型(Int,Float,Double等),Scala遵循Java中的規則。

如果您編寫文字整數3,4等,它們的表達式將保持爲整數。所以

println(3/4) 

具有由兩個整數的表達,因此結果是整數:0

如果任何值恰好是一個浮動的,而不是一個Int,整個表達式加寬成爲浮動。 Double的情況也是如此。這種擴展幾乎是完全自動化的 - 你只需要給編譯器提供你想要的東西,例如

println(3f/4) 

擴大到Float和

println(3.0/4) 

擴大一倍。

在真實程序中使用這些語言功能時,請始終考慮可能發生的精度損失。在這種情況下,您已經注意到導致丟失小數的整數除法。但有浮點不同的情況下,這裏說明:

println(4f/3) 

實際的結果,其中具有二進制小數,不是小數,所以不能夠持有二進制表示(使用IEEE754標準)舉行4f/3沒有一個小錯誤。

scala> println(100f/99f * 99) 
99.99999 

您可能預計它打印100.有時候這並不重要,有時它確實如此。在處理貨幣價值時,一個非常常見的情況是重要的。經驗法則是總是避免浮動和雙倍的金錢:使用BigDecimal來代替,或者只是將便士的數量保持爲Long,或者有時使用Strings(如果BigDecimal沒有被解析爲Double值,辦法)。