Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala范围分割缺少最后一个_Scala - Fatal编程技术网

scala范围分割缺少最后一个

scala范围分割缺少最后一个,scala,Scala,我使用scala Range.by来分割一个范围以获得一个数组,但是对于某些特殊的bucket num,它错过了最后一个,例如100。我很困惑,演示如下: object SplitDemo extends App { val min = 0.0 val max = 7672.142857142857 val bucketNum = 100 def splitsBucket1(min: Double, max: Double, num: Int) = (min to max by

我使用scala Range.by来分割一个范围以获得一个数组,但是对于某些特殊的bucket num,它错过了最后一个,例如100。我很困惑,演示如下:

object SplitDemo extends App {
  val min = 0.0
  val max = 7672.142857142857
  val bucketNum = 100

  def splitsBucket1(min: Double, max: Double, num: Int) = (min to max by ((max - min) / num)).toArray
  def splitsBucket2(min: Double, max: Double, num: Int): Array[Double] = {
    val rst = Array.fill[Double](num + 1)(0)
    rst(0) = min
    rst(num) = max

    val step = (max-min)/num
    for(i <- 1 until num) rst(i) = rst(i-1)+step

    rst
  }

  val split1 = splitsBucket1(min, max, bucketNum)
  println(s"Split1 size = ${split1.size}, %s".format(split1.takeRight(4).mkString(",")))

  val split2 = splitsBucket2(min, max, bucketNum)
  println(s"Split2 size = ${split2.size}, %s".format(split2.takeRight(4).mkString(",")))

}
对象拆分演示扩展应用程序{
最小值=0.0
val最大值=7672.142857142857
val bucketNum=100
def splitsBucket1(最小值:双精度,最大值:双精度,数值:整数)=(最小值到最大值乘以((最大值-最小值)/num)).toArray
def splitsBucket2(最小值:双精度,最大值:双精度,数值:整数):数组[Double]={
val rst=数组。填充[双精度](数值+1)(0)
rst(0)=最小值
rst(num)=最大值
val步长=(最大最小)/num
因为(我这是平常的事

看,
max
在将其除以和乘法后的结果如何不同:

scala> 7672.142857142857 / 100 * 100
res1: Double = 7672.142857142858
而且此数字大于
max
,因此不符合以下范围:

scala> max / bucketNum * bucketNum > max
res2: Boolean = true
它仍然比在
splitsBucket2
中添加
步骤100次更正确:

scala> var result = 0.0
result: Double = 0.0

scala> for (_ <- 0 until 100) result += (max - min) / bucketNum

scala> result
res4: Double = 7672.142857142875

它保证有正确的元素数量,并且比
splitsBucket2

更少的数值精度问题。您尝试过调试吗?首先感谢@Kolmar。Hoever,splitsBucket1的最后一个结果是7595.421428571429,这是一个步距(约76.72)最大限度地说,这似乎不是准确性的问题。@bourneli是最后一个缺少的元素。缺少它是因为它比
max
大。请尝试按((max-min)/num)运行
(min to(max+1))。toArray
,您将看到它
def splitsBucket3(min: Double, max: Double, num: Int): Array[Double] = {
  val step = (max - min) / num
  Array.tabulate(num + 1)(min + step * _)
}