local go=false;
script.Parent.IsRunning.Changed:connect(function()
go=script.Parent.IsRunning.Value;
if go then
while go do
wait(1);
script.Parent.Value=script.Parent.Value-1;
if script.Parent.IsRunning.Value == false then
go=false
end
if script.Parent.Value<=0 then go=false; end
end end end
)
So for some reason, when the value goes false this script doesn't stop. It changes to true for about 15 seconds, then it goes false for about .5 seconds then goes true again, and this is when it runs twice. So rather than only one second subtracting each second, two does, and then three, and so forth for each time the false and then true value is re-set.

2 comments
Excuse the bad indentation and other syntax errors, thanks.
You should break the loop using 'break' when the value is false. So, if IsRunning is false then break the while loop.