首页 > 解决方案 > Kotlin float/int 间接比较

问题描述

对于我正在尝试实现一个Bit类的项目,它可以完成所有应该做的所有常见事情。

如果给定值为,则构造函数应该能够接受任何Number并将Bit的内部状态设置为,否则将其设置为。001

所有适用于整数输入,但是当我浮动时......显然0.0不等于0.

class Bit(value: Number) {
    var value: Int = (value != 0).toInt() // I implemented Bool-to-Int myself
}

现在的问题:

println(Bit(0).value)   // Prints 0
println(Bit(0f).value)  // Prints 1

我认为这是某种近似错误,但是当我尝试时,print(0f != 0)我得到了Operator '!=' cannot be applied to 'Float' and 'Int'. 但是,通过构造函数比较数字没有问题。

我觉得这里有一些我不知道的隐藏的类型转换魔法,所以我的问题基本上是“为什么这没有按预期运行,什么是让它按预期运行的优雅方式?”

标签: genericskotlincastingfloating-point

解决方案


我不能确切地告诉你为什么它的行为不像你期望的那样,但我可以给你一个简单的解决方法!

Number接口没有您希望的那么强大,但它为您提供的主要功能是将其值转换为任何标准数字类型的方法。你可以像这样使用它:

class Bit(value: Number) {
    var value = if (value.toDouble() == 0.0) 0 else 1
}

这将适用于所有Number实现:Byte, Double, Float, Int, Long, Short, AtomicInteger, AtomicLong, BigDecimal, Striped64, 以及您编写或导入的任何其他实现。

(无论你做什么,我建议你也覆盖value's setter,以确保它只包含 0 或 1。)


推荐阅读