Scala

时间:2017-04-21 12:14:46

标签: scala switch-statement conditional rounding

我正在尝试 Scala 中的方法,该方法试图根据数字的大小来舍入数字,例如:如果该值低于1,那么将它舍入至少一个小数点是有意义的;而不是保持整数。这是我正在尝试的内容:

  def roundSmart[A](num: A)(implicit numeric: Numeric[A]) = num match {
    case num if num < 1 => numeric.toDouble(num)
    case _ => numeric.toInt(num)
  }

这引发了这个错误:

  

值&lt;不是类型参数A

的成员

当然,参数需要在函数签名中接受一系列参数类型,因为它可能需要整数或双精度,因此这增加了更多的复杂性。< / p>

我已从此回答中的第一个案例上采用条件语句 -  Using comparison operators in Scala's pattern matching system并且我渴望使用功能编程方法。也许还有一些内置的scala函数,如Math.round(),可以帮助绕过第二个条件,而不是删除任何小数。谢谢!

1 个答案:

答案 0 :(得分:1)

TL; DR:您需要的每种数字方法都在numeric

错误不言自明:您的类型A(通用)没有<方法。

但是,你所拥有的是一个包含所有数字方法的类型类,所以你应该导入它们:

import numeric._

这会导入(除其他外)隐式转换为OrderingOps,它具有所需的方法。但是这种比较不起作用,因为1不是A,而是Int

解决方案只是使用fromInt的{​​{1}}。

在我们处理此问题时,您会对numeric等输入产生意外结果......您最好对数字的绝对值进行测试({{1} }也是-234.2e123)的一种方法。

另外,如果你想做一个简单的测试,就没有必要使用模式匹配,abs语句就足够了

numeric