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」都適合雙精度)。 –