我正在尝试 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()
,可以帮助绕过第二个条件,而不是删除任何小数。谢谢!
答案 0 :(得分:1)
TL; DR:您需要的每种数字方法都在numeric
错误不言自明:您的类型A
(通用)没有<
方法。
但是,你所拥有的是一个包含所有数字方法的类型类,所以你应该导入它们:
import numeric._
这会导入(除其他外)隐式转换为OrderingOps
,它具有所需的方法。但是这种比较不起作用,因为1
不是A
,而是Int
!
解决方案只是使用fromInt
的{{1}}。
在我们处理此问题时,您会对numeric
等输入产生意外结果......您最好对数字的绝对值进行测试({{1} }也是-234.2e123
)的一种方法。
另外,如果你想做一个简单的测试,就没有必要使用模式匹配,abs
语句就足够了
numeric