为什么Kotlin没有十进制?

最近我遇到了一个问题迭代十进制数十进制的步骤,我很奇怪,为什么Kotlin只有IntLongChar Progressions。

我明白,可能会有一些小数点的警告。 但仍然。 我们只想开始BigDecimal数字,结束BigDecimal数字,然后用BigDecimal步骤遍历它们。

问:那么,为什么没有整数的进步呢? 谢谢。

PS:这是一个可能实现的示例代码(我把Int来源和适应BigDecimal ):

 /** * Returns a progression that goes over the same range with the given step. */ public infix fun BigDecimalProgression.step(step: BigDecimal): BigDecimalProgression { if (step <= java.math.BigDecimal.ZERO) throw IllegalArgumentException("Step must be positive, was: $step.") return BigDecimalProgression.fromClosedRange(first, last, if (this.step > java.math.BigDecimal.ZERO) step else -step) } /** * A progression of values of type `BigDecimal`. */ public open class BigDecimalProgression internal constructor ( start: BigDecimal, endInclusive: BigDecimal, step: BigDecimal ) : Iterable<BigDecimal> { init { if (step == BigDecimal.ZERO) throw kotlin.IllegalArgumentException("Step must be non-zero") } /** * The first element in the progression. */ public val first: BigDecimal = start /** * The last element in the progression. */ public val last: BigDecimal = getProgressionLastElement(start, endInclusive, step) /** * The step of the progression. */ public val step: BigDecimal = step override fun iterator(): BigDecimalIterator = BigDecimalProgressionIterator(first, last, step) /** Checks if the progression is empty. */ public open fun isEmpty(): Boolean = if (step > BigDecimal.ZERO) first > last else first < last override fun equals(other: Any?): Boolean = other is BigDecimalProgression && (isEmpty() && other.isEmpty() || first == other.first && last == other.last && step == other.step) override fun hashCode(): Int = if (isEmpty()) -1 else (31 * (31 * first.hashCode() + last.hashCode()) + step.hashCode()) override fun toString(): String = if (step > BigDecimal.ZERO) "$first..$last step $step" else "$first downTo $last step ${-step}" companion object { /** * Creates BigDecimalProgression within the specified bounds of a closed range. * The progression starts with the [rangeStart] value and goes toward the [rangeEnd] value not excluding it, with the specified [step]. * In order to go backwards the [step] must be negative. */ public fun fromClosedRange(rangeStart: BigDecimal, rangeEnd: BigDecimal, step: BigDecimal): BigDecimalProgression = BigDecimalProgression(rangeStart, rangeEnd, step) } } fun getProgressionLastElement(start: BigDecimal, end: BigDecimal, step: BigDecimal): BigDecimal { if (step > BigDecimal.ZERO) { return start + BigDecimal(((end - start) / step).toInt()) * step } else if (step < BigDecimal.ZERO) { return start - BigDecimal(((start - end) / -step).toInt()) * -step } else { throw kotlin.IllegalArgumentException("Step is zero.") } } /** An iterator over a sequence of values of type `BigDecimal`. */ public abstract class BigDecimalIterator : Iterator<BigDecimal> { override final fun next() = nextBigDecimal() /** Returns the next value in the sequence without boxing. */ public abstract fun nextBigDecimal(): BigDecimal } /** * An iterator over a progression of values of type `BigDecimal`. * @property step the number by which the value is incremented on each step. */ internal class BigDecimalProgressionIterator(first: BigDecimal, last: BigDecimal, val step: BigDecimal) : BigDecimalIterator() { private val finalElement = last private var hasNext: Boolean = if (step > BigDecimal.ZERO) first <= last else first >= last private var next = if (hasNext) first else finalElement override fun hasNext(): Boolean = hasNext override fun nextBigDecimal(): BigDecimal { val value = next if (value >= finalElement) { if (!hasNext) throw kotlin.NoSuchElementException() hasNext = false } else { next += step } return value } } 

正如它在范围的文档中所说:

浮点数(Double,Float)没有定义它们的rangeTo运算符,而是使用标准库为泛型Comparable类型提供的代码:

 public operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T> 

该函数返回的范围不能用于迭代。 你将不得不使用一些其他类型的循环,因为你不能使用范围。

他们根本就没有定义

Interesting Posts