如果浮子处于开放或半开放范围,则进行Kotlin试验

如果浮子处于开放或半开放范围,则进行Kotlin试验,kotlin,range,Kotlin,Range,在Kotlin中,是否有一种惯用的方法来测试一个浮点是否在一个范围内,该范围的开始或结束是独占的(或两者都是独占的) 例如 val inRange = 10.f in (0.0f until 20f) 我在文件里找不到这方面的任何东西 更新: 如何处理半开放范围?函数将创建半封闭整数(非浮点)范围,其中包括左部分,排除右部分。 Koltin中有闭合浮动范围支持 你可以自己实施 data class OpenFloatRange(val from: Float, val to: Float)

在Kotlin中,是否有一种惯用的方法来测试一个浮点是否在一个范围内,该范围的开始或结束是独占的(或两者都是独占的)

例如

val inRange = 10.f in (0.0f until 20f)
我在文件里找不到这方面的任何东西

更新:
如何处理半开放范围?

函数将创建半封闭整数(非浮点)范围,其中包括左部分,排除右部分。

Koltin中有闭合浮动范围支持

你可以自己实施

data class OpenFloatRange(val from: Float, val to: Float)
infix fun Float.open(to: Float) = OpenFloatRange(this, to)
operator fun OpenFloatRange.contains(f: Float) = from < f && f < to

val inRange = 10f in (0.0f open 20f)
数据类OpenFloatRange(val-from:Float,val-to:Float)
中缀乐趣浮动。打开(to:Float)=打开浮动范围(this,to)
运算符fun OpenFloatRange.contains(f:Float)=从
在这里,我使用了Kotlin的几个技巧:

受我选择的答案的启发,我想出了这个解决方案,如果有人想重用它,就把它贴在这里

class Range(private val fromInclusive: Boolean, val from: Float, val to: Float, private val toInclusive: Boolean) {

    infix fun contains(value: Float): Boolean {
        return when {
            fromInclusive && toInclusive -> value in from..to
            !fromInclusive && !toInclusive -> value > from && value < to
            !fromInclusive && toInclusive -> value > from && value <= to
            fromInclusive && !toInclusive -> value >= from && value < to
            else -> false
        }
    }
}
类范围(private val from inclusive:Boolean,val from:Float,val to:Float,private val to inclusive:Boolean){
中缀包含(值:浮点):布尔值{
何时返回{
from inclusive&&toInclusive->from..to中的值
!from inclusive&&!to inclusive->value>from&&valuevalue>from&&value>=from&&valuefalse
}
}
}

用法:
val inRange=Range(true,0f,10f,false)包含5f

我觉得这个答案很好:)出于好奇,你为什么直到
才给扩展名命名?这是一个很好的开放浮动范围解决方案!但如何轻松处理半开放浮动区间?可以为所有备选方案创建单独的类(open-open、open-closed、closed-open、closed-closed),但它不会那么漂亮@MariusKohmann您可以有两个额外的属性:
isLeftClosed:Boolean,isRightClosed:Boolean
。请记住,浮点数本质上是不精确的。(不管怎么说,在十进制术语中:正如1/3没有终止小数一样,1/10也没有终止二进制小数。因此,不能用二进制浮点值精确表示0.1。)因此,您确实不想完全依赖于范围是否包含其端点,由于所有的二进制近似,您的值可能已经偏移了很多!