是否可能定义一个通用的指数运算符,可以像这样进行接口化:
> 10^3 // 1000
> 2.71^2 // 7.3441
> 3.14^(-3.14) // 0.027..
根据文档,可以使用中缀函数扩展类:
// Define extension to Int
infix fun Int.exp(exponent: Int): Int {
...
}
但是它们不允许像^
这样的符号。
是否可能定义一个通用的指数运算符,可以像这样进行接口化:
> 10^3 // 1000
> 2.71^2 // 7.3441
> 3.14^(-3.14) // 0.027..
根据文档,可以使用中缀函数扩展类:
// Define extension to Int
infix fun Int.exp(exponent: Int): Int {
...
}
但是它们不允许像^
这样的符号。
2.0.pow(4)
。Pow是来自kotlin.math的函数。 - Ayxan Haqverdili我使用 Math。在 Android Studio 中,不允许使用带引号的 ^
符号。因此,我定义了一个反向的 ^
运算符作为 v
,虽然它看起来有点不美观,但比进行大量类型转换和使用 pow
表示法要好得多。
inline infix fun Double.v(exponent: Int): Double = this.pow(exponent)
inline infix fun Double.v(exponent: Long): Double = this.pow(exponent.toDouble())
inline infix fun Double.v(exponent: Double): Double = this.pow(exponent)
inline infix fun Int.v(exponent: Int): Double = this.toDouble().pow(exponent)
inline infix fun Int.v(exponent: Long):
Double = this.toDouble().pow(exponent.toDouble())
inline infix fun Int.v(exponent: Double): Double = this.toDouble().pow(exponent)
inline infix fun Long.v(exponent: Int): Double = this.toDouble().pow(exponent)
inline infix fun Long.v(exponent: Long):
Double = this.toDouble().pow(exponent.toDouble())
inline infix fun Long.v(exponent: Double):
Double = this.toDouble().pow(exponent)
inline
使用在运行时不会增加额外的负载,即使在更重的循环内部也是如此。
不幸的是,损坏的运算符优先级强制你用括号将指数运算括起来。并且编译器强制你两侧添加空格。
毕竟,哪种方式看起来最好?
这样做呢?
var k=2
...
println((k v 5)+3)
var k=2
...
println(k.toDouble().pow(5) + 3)
^
。在Java、C#和许多其他语言中,^
运算符执行 异或 操作,所以在Kotlin中看到它执行不同的操作会令人惊讶。 - ean5533**
可能是更安全的选择。 - TomTom