0
我有以下四种方法,使用的BigDecimal把一个数字:如何概括轮方法
private def round(input: Byte, scale: Int): Byte = {
BigDecimal(input).setScale(scale, RoundingMode.HALF_UP).byteValue()
}
private def round(input: Short, scale: Int): Short = {
BigDecimal(input).setScale(scale, RoundingMode.HALF_UP).shortValue()
}
private def round(input: Int, scale: Int): Int = {
BigDecimal(input).setScale(scale, RoundingMode.HALF_UP).intValue()
}
private def round(input: Long, scale: Int): Long = {
BigDecimal(input).setScale(scale, RoundingMode.HALF_UP).longValue()
}
并计划把它概括成一个单一的圆:
private def round[T](input: Any, scale: Int, f: (BigDecimal) => T): T = {
f(BigDecimal(input.asInstanceOf[T]).setScale(scale, RoundingMode.HALF_UP))
}
,并使用此圆是这样的:
round[Byte](b, scale, _.byteValue)
round[Short](s, scale, _.shortValue)
但上面的广义round
没有因为工作BigDecimal.apply
不能适用于T
,我该怎么办?
谢谢您的回答,我为什么要转换N到翻番?会不会Long型溢出? –
@YijieShen n未转换为“Double”,n是''T'类型的'Numeric'类的实例,它将'input'转换为'Double'。然后'Double'用于创建'BigDecimal'。 –
虽然转换为double是一个合理的问题。如果'input'本身是一个'BigDecimal'(或者任何不能安全转换为'Double'的东西)?现在确实,OP的代码片段没有这种情况,但即使对于“Long” - 就像OP代码中的第4次重载一样 - 这是不安全的(并非所有的“Long”都适合双精度)。 –