为什么scala在此模运算中返回超出范围的值?

尼塔基

这是一段代码,用于生成给定范围内的随机Long值,为清楚起见对其进行了简化:

def getLong(min: Long, max: Long): Long = {
  if(min > max) {
    throw new IncorrectBoundsException
  }
  val rangeSize = (max - min + 1L)
  val randValue = math.abs(Random.nextLong())
  val result = (randValue % (rangeSize)) + min
  result
}

我知道这个结果并不统一,这不会为一些值正常工作minmax,但这不是重点。

在测试中发现,以下断言并不总是正确的:

getLong(-1L, 1L) >= -1L

更具体地说,返回值是-3这怎么可能呢?

尼塔基

事实证明,math.abs(x: Long): Long不能保证总是返回非负值!没有Long可以表示的值math.abs(Long.MinValue),因此,它不会抛出异常,而是math.abs返回Long.MinValue

scala> Long.MinValue
res27: Long = -9223372036854775808

scala> math.abs(Long.MinValue)
res28: Long = -9223372036854775808

scala> math.abs(Long.MinValue) % 3
res29: Long = -2

scala> math.abs(Long.MinValue) % 3 + (-1)
res30: Long = -3

在我看来,这是一个很好的例子,说明了为什么应该使用ScalaCheck来测试其代码库的至少一部分。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么访问MySQL表中的任何值时,SparkSQL总是返回超出范围的值?

来自分类Dev

Python在此功能上返回IndexError:字符串索引超出范围为什么

来自分类Dev

为什么在此函数中出现超出范围的异常?

来自分类Dev

在隐式类运算符中防止值超出范围的合适方法是什么?

来自分类Dev

为什么sklearn MinMaxScaler()返回超出范围的值而不是错误?

来自分类Dev

为什么我的R循环返回超出范围的错误?

来自分类Dev

为什么会返回超出范围的索引?

来自分类Dev

为什么我在C ++中超出范围,但在Perl中却超出范围?

来自分类Dev

为什么我可以在超出范围的方法中修改List而不返回它?

来自分类Dev

为什么函数在 Python 中返回错误“列表索引超出范围”?

来自分类Dev

为什么此算法中的数组索引超出范围?

来自分类Dev

为什么在此代码中出现数组超出范围错误?

来自分类Dev

Where子句返回超出范围的值

来自分类Dev

为什么索引超出范围

来自分类Dev

为什么struct变量超出范围

来自分类Dev

为什么矢量下标超出范围?

来自分类Dev

为什么会超出范围?

来自分类Dev

为什么光标索引超出范围?

来自分类Dev

为什么索引超出范围?

来自分类Dev

为什么此变量超出范围?

来自分类Dev

为什么索引超出范围?

来自分类Dev

为什么我的for循环超出范围?

来自分类Dev

为什么索引超出范围?(Python)

来自分类Dev

为什么将对象作为指针传递但不在返回范围时超出范围

来自分类Dev

为什么在列表片上的任何超出范围的索引中添加:都不会超出范围?

来自分类Dev

为什么取模运算会返回意外值

来自分类Dev

当我输入超出范围的数字时,为什么它不返回任何类型?

来自分类Dev

为什么我可以为TypeScript枚举分配明确的超出范围的值?

来自分类Dev

为什么我不能静态引用一个永不超出范围的值?

Related 相关文章

  1. 1

    为什么访问MySQL表中的任何值时,SparkSQL总是返回超出范围的值?

  2. 2

    Python在此功能上返回IndexError:字符串索引超出范围为什么

  3. 3

    为什么在此函数中出现超出范围的异常?

  4. 4

    在隐式类运算符中防止值超出范围的合适方法是什么?

  5. 5

    为什么sklearn MinMaxScaler()返回超出范围的值而不是错误?

  6. 6

    为什么我的R循环返回超出范围的错误?

  7. 7

    为什么会返回超出范围的索引?

  8. 8

    为什么我在C ++中超出范围,但在Perl中却超出范围?

  9. 9

    为什么我可以在超出范围的方法中修改List而不返回它?

  10. 10

    为什么函数在 Python 中返回错误“列表索引超出范围”?

  11. 11

    为什么此算法中的数组索引超出范围?

  12. 12

    为什么在此代码中出现数组超出范围错误?

  13. 13

    Where子句返回超出范围的值

  14. 14

    为什么索引超出范围

  15. 15

    为什么struct变量超出范围

  16. 16

    为什么矢量下标超出范围?

  17. 17

    为什么会超出范围?

  18. 18

    为什么光标索引超出范围?

  19. 19

    为什么索引超出范围?

  20. 20

    为什么此变量超出范围?

  21. 21

    为什么索引超出范围?

  22. 22

    为什么我的for循环超出范围?

  23. 23

    为什么索引超出范围?(Python)

  24. 24

    为什么将对象作为指针传递但不在返回范围时超出范围

  25. 25

    为什么在列表片上的任何超出范围的索引中添加:都不会超出范围?

  26. 26

    为什么取模运算会返回意外值

  27. 27

    当我输入超出范围的数字时,为什么它不返回任何类型?

  28. 28

    为什么我可以为TypeScript枚举分配明确的超出范围的值?

  29. 29

    为什么我不能静态引用一个永不超出范围的值?

热门标签

归档