2017-06-01 93 views
0
fun calcInterest(amount: Double, interest: Double): Double { 
    return(amount *(interest/100.0)) 
} 

fun main(args: Array<String>) { 

    for (i in 1.0..2.0 step .5) { 
     println("&10,000 at 5% interest is = ${calcInterest(10000.0,i)}") 
    } 

} 

我得到错误,说For-loop范围必须有'Iterator()'方法。它强调了我的部分中的双打(我在1.0..2.0)Kotlin中使用数据类型的范围Double

如何在一个范围内使用双打? Ranges Reloaded上的一个网站(https://blog.jetbrains.com/kotlin/2013/02/ranges-reloaded/)显示使用数据类型Double很好。我不知道我的问题。我需要使用双打,因为我的利率是使用小数。完全新编程,希望有人能够简单解释。谢谢!

编辑:添加步0.5

+1

那么这是一个非常奇怪的事情来尝试,它甚至应该做什么?列举1到2之间的所有4503599627370496双打?好多啊。 – harold

+0

看起来这个功能已经被删除了,你必须使用'while'循环。 – zsmb13

+0

我的意思是增加0.5步,增加0.5倍,而不是两倍。虽然我猜你不能在范围内使用双打:/ –

回答

1

按照documentation for ranges

浮点数(DoubleFloat)没有定义自己的rangeTo运营商,并通过标准库通用提供的一个可比类型来代替:

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

该函数返回的范围不能用于迭代。

由于无法使用范围,因此您将不得不使用其他类型的循环。

2

从Kotlin 1.1起,ClosedRange<Double>“不能用于迭代”(rangeTo() - Utility functions - Ranges - Kotlin Programming Language)。

但是,您可以为此定义您自己的stepextension function。例如: -

infix fun ClosedRange<Double>.step(step: Double): Iterable<Double> { 
    require(start.isFinite()) 
    require(endInclusive.isFinite()) 
    require(step > 0.0) { "Step must be positive, was: $step." } 
    val sequence = generateSequence(start) { previous -> 
     if (previous == Double.POSITIVE_INFINITY) [email protected] null 
     val next = previous + step 
     if (next > endInclusive) null else next 
    } 
    return sequence.asIterable() 
} 

虽然你可以做到这一点,如果你是钱而工作,你真不该使用Double(或Float)。见Java Practices -> Representing money