java.lang.Math与kotlin.math兼容吗?

时间:2018-03-18 12:08:10

标签: java math kotlin rounding java.lang

我正在学习Kotlin并在Math class中遇到了这个问题:

java.lang.Mathkotlin.math不兼容。这对我来说有点尴尬和困惑,因为Kotlin声称它与Java 100%兼容。也许这只是我感觉很困惑的我,但我想听听社区意见,以确认我的感觉是否正确。

问题在于数字四舍五入。请注意以下简单的Kotlin代码:

fun main(args: Array<String>) {
val neg = -152.5
val kotlinAbsoluteValue = kotlin.math.abs(neg)
val javaAbsoluteValue = java.lang.Math.abs(neg)
println("Original Variable: $neg")
println("Absolute Value in Java: $javaAbsoluteValue")
println("Absolute Value in Kotlin: $kotlinAbsoluteValue")
println("Rounding kotlinAbsoluteValue in Java: ${java.lang.Math.round(kotlinAbsoluteValue)}")
println("Rounding kotlinAbsoluteValue in Kotlin: ${kotlin.math.round(kotlinAbsoluteValue)}")
println("Rounding javaAbsoluteValue in Java: ${java.lang.Math.round(javaAbsoluteValue)}")
println("Rounding javaAbsoluteValue in Kotlin ${kotlin.math.round(javaAbsoluteValue)}")
}

输出:

Original Variable: -152.5
Absolute Value in Java: 152.5
Absolute Value in Kotlin: 152.5
Rounding kotlinAbsoluteValue in Java: 153
Rounding kotlinAbsoluteValue in Kotlin: 152.0
Rounding javaAbsoluteValue in Java: 153
Rounding javaAbsoluteValue in Kotlin 152.0

我看到Java Math正在向上舍入到long值,而Kotlin则向下舍入到kotlin.Double值。两种不同语言的Math类的实现是不同的,这不会引起混淆,因为它们都是针对JVM的?

由于

1 个答案:

答案 0 :(得分:5)

kotlin.math.round的文档说:

  

将给定值x舍入到最接近的整数,并将关系舍入为偶数整数。

所以152.5与152和153的距离相等,因此它会四舍五入为偶数整数,即152.

另一方面,Java的round说:

  

返回与参数最接近的long [或int,具体取决于提供的参数],并将关系舍入为正无穷大。

查看kotlin.math.round source code,该函数只是将操作委托给Java的Math.rint(x)