println(3/4)
>0
我想獲得一個小數的答案,而不是一個整數。由於我在我的實際代碼中打印的方式,如果可能的話,我寧願在println中投射。
println(3/4)
>0
我想獲得一個小數的答案,而不是一個整數。由於我在我的實際代碼中打印的方式,如果可能的話,我寧願在println中投射。
以上都有幫助嗎?
println(3.0/4.0)
println(3.toDouble/4.toDouble)
如果你輸入的號碼,只需鍵入其中至少有一個爲float(我假定你的意思Float
不Double
):
println(3f/4)
如果你已經在變量的數字,將它們轉換中的至少一個與toFloat
val x = 3
println(x.toFloat/4)
(在每種情況下,如果有至少一個,編譯器將其他轉換成Float
匹配。)
對於原始類型(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值,辦法)。
你可能想要使用double而不是float。 –