51

如果我执行以下操作

 println(3/4)
 >0

我想得到一个十进制的答案而不是一个整数。由于我在实际代码中打印的方式,如果可能的话,我更愿意在 println 中进行转换。

4

3 回答 3

66

如果您正在输入数字,只需将其中至少一个输入为浮点数(我假设您的意思Float不是Double):

println(3f/4)

如果您已经在变量中有数字,请至少将其中一个转换为toFloat

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

(在每种情况下,如果您至少有一个,编译器会将另一个转换Float为匹配。)

于 2012-06-20T16:07:24.930 回答
32

这些有帮助吗?

println(3.0/4.0)
println(3.toDouble/4.toDouble)
于 2012-06-20T16:06:13.720 回答
9

对于原始类型(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 值方法)。

于 2012-06-21T22:43:54.407 回答