我的循环循环次数超出了预期

Posted

技术标签:

【中文标题】我的循环循环次数超出了预期【英文标题】:My loop is looping more than it's supposed to 【发布时间】:2019-05-05 09:54:51 【问题描述】:

脚本应该通过降低透明度来逐渐增加发光效果。一旦对象不再被触摸,它应该逐渐失去发光直到不再发光,方法是将透明度增加到 1。

当我让它在运行时打印数值时,我看到数值超过 1 并且似乎以比循环中设置的 .01 更高的间隔计数。它不会逐渐起作用 - 它会在循环运行时突然中断或开启。

我无法弄清楚为什么它会超过 1 或如何将其保持为逐渐增加,即使触摸在达到 100 次循环迭代之前结束。

这是脚本:

local glow = script.Parent.orb
glow1 = 1

-- turn on when touched

glow.Touched:connect(function(obj)

    if obj.Parent:FindFirstChild("Humanoid") then
        for i = 0, 1, .01 do

            glow1 = glow1 - .01
            glow.ParticleEmitter.Transparency = NumberSequence.new(glow1)
            wait(.1)
            print(glow1)

        end
    glow1=0
    end
end)


-- turn off when no longer touched

glow.TouchEnded:connect(function(obj)

    wait(3)
    if obj.Parent:FindFirstChild("Humanoid") then
        for i = 0, 1, .01 do

            glow1 = glow1 + .01
            glow.ParticleEmitter.Transparency = NumberSequence.new(glow1)
            wait(.1)
            print(glow1)

        end
    end
end)

【问题讨论】:

触摸的条件是什么,所以你可以使用while循环?在此示例中,您的循环都将执行 101 次。此外,从 1 到 100 的循环肯定更好读。 【参考方案1】:

在循环结束时,glow1 大于 0,因为 0.01 不能精确地表示为浮点数。在我的电脑上,它的值实际上是 0.01000000000000000020816681711721685132943093776702880859375。我猜这是以 2 为底的最接近的近似值。 (尝试print(('%.99f'):format(0.01)) 以查看您机器上的确切值。)所以乘以 100 大于 1。

还有其他发帖者在 Lua 中的数学比我好得多,但正如 csaar 可能建议的那样,您可以使用 repeat until 循环来确保 glow1 不会越过边界值 (@987654325 @),或者您可以数除 (for i = 1, 100 do glow1 = i / 100 --[[ do something here ]] end)。不知道哪个更好。

【讨论】:

glow1 = i * 0.01 更接近 OP 的意图。【参考方案2】:

Touched 事件可能会触发多次。

您可以阅读有关它的更多信息以及如何修复它here。

【讨论】:

以上是关于我的循环循环次数超出了预期的主要内容,如果未能解决你的问题,请参考以下文章

For 循环的迭代次数少于我在 Python 中的预期

matlab循环次数过多出现NAN?

在定义的循环次数后批量退出循环

为啥我的 UICollectionView 无法访问我在 for 循环中创建的数组 - 致命错误:索引超出范围

如何确定for循环的次数

for循环和next方法迭代生成器,满足我的预期就OK了