Argumento padrão como função de outro argumento

Basta usar currying e um argumento implícito:

def smartFloor(x: Double)(
implicit precision: Double = math.log10(x).floor
) = x - (x % math.pow(10, precision))

Uso:

scala> smartFloor(1234)
res
: Double = 1000.0

scala
> smartFloor(0.542)
res
: Double = 0.5

scala
> smartFloor(0.542)(-2)
res
: Double = 0.54