How to handle floating point observable to keep rounding at two digits?

I am trying to draw an interactive plot of a SIV model with GLMakie. I have added the sliders and forced the values associated to these sliders to two decimal digits. While the sliders for the parameters mu and omega work fine, that for kappa goes in floating point. I set the values for this slider, as for the others, with the line k_val = @lift string("kappa ", round($p_mod[2], digits=2)).
Why does it go back to floating point? Why only kappa and not the others?
How can I force the rounding for this slider?
Thank you

This is the code:

## packages and functions
using GLMakie, DifferentialEquations
function odeSolver!(du, u, p, t) 
    μ, κ, ω, δ, η, β, λ = p
    # μ bacterial growth rate
    # κ bacterial carrying capacity
    # ω system wash-out rate
    # δ phagial infection rate
    # η phagial lysis rate (inverse latency)
    # β phagial burst size
    # λ phagial decay rate
    # du[1] = S; du[2] = I; du[3] = V
    ρ = 1 - (u[1] + u[2])/κ     # rho: logistic factor
    ϡ = (δ*u[1]*u[3])           # upsampi : infected bacteria
    du[1] = (μ*u[1]*ρ) - ϡ             - (ω*u[1])
    du[2] =              ϡ - (η*u[2])  - (ω*u[2])
    du[3] = (β*η*u[2]) - ϡ - (λ*u[3])  - (ω*u[3])
end

## initial parameters
begin
    mu = 0.16       # μ: default growth rate
    kappa = 2.2e7   # κ: default carrying capacity
    omega = 0.05    # ω: default outflow
    eta = 0.025     # η: default τ reciprocal    
    delta = 1e-9    # δ: default adsorption rate 
    beta = 50       # β: default burst size 
    lambda = 0      # λ: default decay rate
    s0 = 1e5        # default starting amount of naive bacteria
    i0 = 0          # default starting amount of infected bacteria
    v0 = 1e5        # default starting amount of phages
    tm = 2000.0     # default time span 
end

## starting values ODE
begin
    u0 = [s0, i0, v0]
    tspan = [0.0, tm] 
    parms = [mu, kappa, omega, delta, eta, beta, lambda]
    prob = ODEProblem(odeSolver!, u0, tspan, parms)
    soln = solve(prob, Rosenbrock23())
end

## set obervables
p_mod = Observable(parms)
u_mod = Observable("") 


## plot
# instantiate figure
fig = Figure(size = (1920, 1080))
ax = Axis(fig[1, 1:2])
# ranges
S_values = LinRange(0.0, 1.0e7, 100) 
I_values = LinRange(0.0, 1.0e7, 100)
V_values = LinRange(0.0, 1.0e7, 100)
mu_values = LinRange(0.0, 1.0, 100) 
kappa_values = LinRange(0.0, 1.0e9, 100)
omega_values = LinRange(0.0, 1.0, 100)
# labels
mu_val = @lift string("mu ", round($p_mod[1], digits=2))
k_val = @lift string("kappa ", round($p_mod[2], digits=2))
o_val = @lift string("omega ", round($p_mod[3], digits=2))
Label(fig[2,1], mu_val, fontsize = 18)
Label(fig[3,1], k_val, fontsize = 18)
Label(fig[4,1], o_val, fontsize = 18)
# sliders
mu_sld = Slider(fig[2, 2], range = mu_values, startvalue = mu)
k_sld = Slider(fig[3, 2], range = kappa_values, startvalue = kappa)
o_sld = Slider(fig[4, 2], range = omega_values, startvalue = omega)
# update parameters
on(mu_sld.value) do val 
    p_mod.val[1] = val 
    p_mod[] = p_mod[]  
    ylims!(ax, 0, max(maximum(X[]), maximum(Y[]))*1.1)
end
on(k_sld.value) do val 
    p_mod.val[2] = val 
    p_mod[] = p_mod[]  
    ylims!(ax, 0, max(maximum(X[]), maximum(Y[]))*1.1)
end
on(o_sld.value) do val 
    p_mod.val[3] = val 
    p_mod[] = p_mod[]  
    ylims!(ax, 0, max(maximum(X[]), maximum(Y[]))*1.1) 
end
R = LinRange(tspan[1], tspan[2], 500)
data = lift(p_mod) do p_new
    prob = ODEProblem(odeSolver!, u0, tspan, parms)
    return solve(prob, Rosenbrock23(), p = p_new, saveat = R)
end
# draw
X = @lift $data[1,:]
Y = @lift $data[2,:]
lines!(ax, R, X, linewidth = 5, color =:blue)
lines!(ax, R, Y, linewidth = 2.5, color =:gold)