如何通过类型归属实现自定义Decimal2类的数值四舍五入?
解决方案
你的代码存在两个核心问题,对应你遇到的两个现象:
问题1:apply方法返回类型错误
当前apply方法返回的是Double,但我们需要它返回Decimal2实例。应该先完成四舍五入计算,再用处理后的值创建Decimal2对象。
问题2:隐式转换的逻辑闭环问题
原代码里的隐式转换调用Decimal2(x),但apply返回的是Double,这会导致类型不匹配,最终赋值失败。
修正后的完整代码:
class Decimal2(val value: Double) object Decimal2 { // 修正apply方法,返回Decimal2实例 def apply(value: Double): Decimal2 = { val roundedValue = BigDecimal(value) .setScale(2, BigDecimal.RoundingMode.HALF_UP) .toDouble new Decimal2(roundedValue) } // 隐式转换:将Double自动转为Decimal2(会触发apply里的四舍五入逻辑) implicit def doubleToDecimal2(x: Double): Decimal2 = Decimal2(x) } // 测试代码 val a: Decimal2 = 1.2345 println(a.value) // 输出1.24
关键说明
apply方法现在明确返回Decimal2,内部先对输入的Double做四舍五入处理,再用处理后的值实例化Decimal2。- 隐式转换
doubleToDecimal2会在你把Double赋值给Decimal2类型变量时自动触发,调用Decimal2.apply完成四舍五入和类型转换。 - 如果你需要直接获取四舍五入后的数值,可以通过
a.value访问。
内容的提问来源于stack exchange,提问作者Sergey Bushmanov
相关产品推荐
相关产品推荐

