You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过类型归属实现自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:16:02