gpt4 book ai didi

scala - 将数字类型转换为不带参数的 double

转载 作者:行者123 更新时间:2023-12-02 06:26:49 25 4
gpt4 key购买 nike

我正在尝试实现一种通用方法来计算包含任何类型数值(Int、Float、Double...)的任何类型序列(例如:List、Array)的平均值,如下所示:


def mean[T <: Numeric[T]](data:Seq[T])(implicit number: Numeric[T]): T = {
data.foldLeft(number.zero)(number.plus) / data.size
}

但是除法运算无法解析。那是因为 Numeric 类型没有定义这个操作(来自 ScalaDoc )。我想在继续除法之前将它转换为 double ,但是数值类型的方法 toDouble(x:T) 需要一个参数。我已经看到 Numeric[T] 有一个名为 NumericOps 的类型成员,它在没有接收任何参数的情况下实现了 toDouble 方法。我可以调用这个方法.. 不知何故?

最佳答案

这是一个使用小数的例子,它将保持输入数字的正确精度,并且只对数据进行一次遍历。但是,请注意,这仅适用于具有“精确” 划分的类型,例如FloatDoubleBigDecimal。但不适用于 IntLong 等数字类型。

def mean[T](data: Iterable[T])(implicit N: Fractional[T]): T = {
import N._

val remaining = data.iterator

@annotation.tailrec
def loop(sum: T, count: Int): T =
if (remaining.hasNext)
loop(sum + remaining.next(), count + 1)
else if (count == 0)
zero
else
sum / fromInt(count)

loop(zero, 0)
}

这是在 Scala 2.13 上测试的。

关于scala - 将数字类型转换为不带参数的 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58051053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com