加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:尽管在添加时使用了Long,但仍会溢出

发布时间:2020-12-16 18:33:22 所属栏目:安全 来源:网络整理
导读:在2.7.5.final,我试图添加一个Intrable Int这样的列表 def sum(xs: Iterable[Int]): Long = { var sum = 0L xs.foreach((x) = sum = sum + x) sum}println(sum(List(1,Integer.MAX_VALUE - 1)))println(sum(Integer.MAX_VALUE - 1 to Integer.MAX_VALUE))pri
在2.7.5.final,我试图添加一个Intrable Int这样的列表

def sum(xs: Iterable[Int]): Long = {
  var sum = 0L
  xs.foreach((x) => sum = sum + x)
  sum
}

println(sum(List(1,Integer.MAX_VALUE - 1)))
println(sum(Integer.MAX_VALUE - 1 to Integer.MAX_VALUE))
println(0L + Integer.MAX_VALUE - 1 + Integer.MAX_VALUE)

当我跑步时,我明白了

2147483647
0
4294967293

并且,您可能会说“使用reduceLeft(_ _)”,但它似乎只能返回与列表中的元素相同的类型…但我想累积到Long,所以我没有溢出的问题.

更新2009-10-28

正如Eastsun所指出的,这是Range中的一个错误.它已于ticket 2535向Scala团队报告

解决方法

这是Range的一个错误.
有一个Range的foreach方法的源代码:

override def foreach(f: Int => Unit) {
if (step > 0) {
  var i = this.start
  *val until = if (inInterval(end)) end + 1 else end*      //bug here!!!

  while (i < until) {
    f(i)
    i += step
  }
} else {
  var i = this.start
  val until = if (inInterval(end)) end - 1 else end

  while (i > until) {
    f(i)
    i += step
  }
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读