TweenService or repeat loop for decreasing values?

I was wondering if it is better off to use a repeat loop or tweenservice to decrease a numeric value?

function GameEngine.ChangeCD(Player: Player?, CD: IntValue?)
    if Player:FindFirstChild("CD") then
        CD.Value = 2
        coroutine.wrap(function()
               if CD.Value >= 0 then
                 repeat 
                 task.wait(0.6)
                    CD.Value -= 1
                until CD.Value <= 0
                end
        end)()
    end
end
-- TweenService
game:GetService("TweenService"):Create(CD, TweenInfo.new(1.2), {Value = 0}):Play()

It Depends,

For TweenService

It should try to smoothly set the Value to the Desired Value you want it to, The Downside is that it isn’t always accurate in doing this, there are times it can be slightly off of the Expected Value (usually a Barley noticeable difference), this can be fixed by changing the value when the Tween is Completed


For loops

It depends on the use case, Setting the value is more (If not completely) accurate and absolute when used, the only real downside is that it stops the whole script when using it, easy fix to this can vary (Ex: coroutine, spawn)