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

ric*_*oni 43 floating-point integer casting scala

如果我做以下事情

 println(3/4)
 >0
Run Code Online (Sandbox Code Playgroud)

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

Rex*_*err 57

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

println(3f/4)
Run Code Online (Sandbox Code Playgroud)

如果您已在变量中包含数字,请至少转换其中一个 toFloat

val x = 3
println(x.toFloat/4)
Run Code Online (Sandbox Code Playgroud)

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

  • 你可能想要使用double而不是float. (4认同)

Ale*_*son 26

这些都有帮助吗?

println(3.0/4.0)
println(3.toDouble/4.toDouble)
Run Code Online (Sandbox Code Playgroud)


Ric*_*777 7

对于原始类型(Int,Float,Double等),Scala遵循Java中的规则.

如果您编写文字整数3,4等,它们的表达式将保持为整数.所以

println(3/4)
Run Code Online (Sandbox Code Playgroud)

有一个由两个整数组成的表达式,所以结果是一个整数:0.

如果任何值恰好是Float而不是Int,则整个表达式变宽以变为Float.Double也是如此.这种扩展几乎完全自动发生 - 您只需要给编译器提供您想要的提示,例如

println(3f/4)
Run Code Online (Sandbox Code Playgroud)

扩大到Float和

println(3.0/4)
Run Code Online (Sandbox Code Playgroud)

扩大到双倍.

在实际程序中使用这些语言功能时,请始终考虑可能发生的精度损失.您已经注意到整数除法导致在这种情况下丢失小数部分.但是这里有一个不同的浮点情况:

println(4f/3)
Run Code Online (Sandbox Code Playgroud)

实际结果以二进制表示(使用IEEE754标准)保存,该二进制表示具有二进制分数,而不是小数分数,因此在没有小错误的情况下不能保持4f/3.

scala> println(100f/99f * 99)
99.99999
Run Code Online (Sandbox Code Playgroud)

您可能已经预料到它会打印100.有时候这并不重要,有时也会这样.一个很重要的案例是处理货币价值时.经验法则总是避免浮动和双倍换钱:改为使用BigDecimal,或者只是将pence的数量保持为Long,或者有时候使用Strings(与BigDecimal很好地匹配,前提是它们不被解析为Double值)办法).