如果我执行以下操作
println(3/4)
>0
我想得到一个十进制答案而不是一个整数。由于我在实际代码中打印的方式,如果可能的话,我宁愿在println中进行转换。
答案 0 :(得分:49)
如果您输入的是号码,只需键入其中至少一个为浮点数(我假设您的意思是Float
而不是Double
):
println(3f/4)
如果您已在变量中包含数字,请使用toFloat
val x = 3
println(x.toFloat/4)
(在每种情况下,如果您至少有一个,编译器会将另一个转换为Float
以匹配。)
答案 1 :(得分:24)
这些都有帮助吗?
println(3.0/4.0)
println(3.toDouble/4.toDouble)
答案 2 :(得分:6)
对于原始类型(Int,Float,Double等),Scala遵循Java中的规则。
如果编写文字整数3,4等,它们的表达式将保持为整数。所以
println(3/4)
有一个由两个整数组成的表达式,因此结果是一个整数:0。
如果任何值恰好是Float而不是Int,则整个表达式变宽以变为Float。 Double也是如此。这种扩展几乎完全自动发生 - 您只需要给编译器提供您想要的提示,例如
println(3f/4)
扩展为Float和
println(3.0/4)
扩大到双倍。
在实际程序中使用这些语言功能时,请始终考虑可能发生的精度损失。您已经注意到整数除法导致在这种情况下丢失小数部分。但是这里有一个不同的浮点情况:
println(4f/3)
实际结果以二进制表示(使用IEEE754标准)保存,该二进制表示具有二进制分数,而不是小数分数,因此在没有小错误的情况下无法保持4f / 3。
scala> println(100f/99f * 99)
99.99999
您可能已经预料到它会打印100.有时这无关紧要,有时也会这样。一个很重要的案例是处理货币价值时。经验法则总是避免浮动和双倍换钱:改为使用BigDecimal,或者只是将pence的数量保持为Long,或者有时候使用Strings(与BigDecimal很好地匹配,前提是它们不被解析为Double值)方式)。