Scala除以两个整数并获得浮点结果

时间:2012-06-20 16:04:10

标签: scala casting floating-point integer

如果我执行以下操作

 println(3/4)
 >0

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

3 个答案:

答案 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值)方式)。