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