You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala如何实现支持多数值类型的固定步长序列生成函数

Scala 多数值类型通用序列生成实现方案

借助Scala标准库提供的Numeric类型类即可实现跨Int、Long、Float、Double等数值类型的泛型序列生成逻辑,同时完全兼容你原有的舍入规则和生成逻辑,简化实现如下:

import java.text.DecimalFormat
import scala.annotation.tailrec

// 通用舍入方法:浮点类型保留两位小数,整型直接返回原值
def round[T](elem: T)(using num: Numeric[T]): T = elem match {
  case f: Float => new DecimalFormat("###.##").format(f).toFloat.asInstanceOf[T]
  case d: Double => new DecimalFormat("###.##").format(d).toDouble.asInstanceOf[T]
  case _ => elem
}

// 泛型序列生成方法,逻辑和原有Double版本完全对齐
def arrange[T: Numeric](start: T, end: T, increment: T): Seq[T] = {
  val num = summon[Numeric[T]]
  @tailrec
  def recurse(acc: Seq[T], current: T): Seq[T] = {
    if (num.gteq(current, end)) acc
    else {
      val next = round(num.plus(current, increment))
      recurse(acc :+ next, next)
    }
  }
  recurse(Seq.empty[T], start)
}

测试示例

原有Double场景调用

和你原有版本输出完全一致:

arrange(0.0, 0.55, 0.05) foreach println

输出:

0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55

其他数值类型调用

  • Int类型示例:
// 生成1到10之间步长为2的序列
arrange(1, 10, 2) foreach println
// 输出:3、5、7、9
  • Long类型示例:
// 生成100到200之间步长为20的序列
arrange(100L, 200L, 20L) foreach println
// 输出:120、140、160、180
  • Float类型示例:
// 生成0到0.3之间步长为0.05的序列
arrange(0.0f, 0.3f, 0.05f) foreach println
// 输出:0.05、0.1、0.15、0.2、0.25、0.3

如果你使用的是Scala 2版本,只需将代码中的using替换为implicit,summon[Numeric[T]]替换为implicitly[Numeric[T]]即可正常运行。

内容的提问来源于stack exchange,提问作者joesan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:06:07