Flash Modulus Glitch?

时间:2012-03-20 18:53:17

标签: actionscript-3 flash actionscript modulus

这让我绝对疯狂!为什么这不起作用? if语句永远不会跳闸,即使跟踪清楚地显示该死的数字%10等于零......

var starSpawnTime:int = 0;
stage.addEventListener(Event.ENTER_FRAME, update);
stop();

function update(e:Event): void {
starSpawnTime++;

trace(starSpawnTime);
trace("Modulus: " + starSpawnTime % 10);

if ((starSpawnTime % 10) == 0) {
    sStarBuffer = new SStar();
    sStarBuffer.x = 560;
    sStarBuffer.y = getRandomNumber(0, 400);
    stage.addChild(sStarBuffer);
    stars.push(sStarBuffer);
}

2 个答案:

答案 0 :(得分:0)

由于浮点舍入错误,可能会产生误导。使用浮点数时,您通过保留两个乘数并使用它们的倍数来表示数字来近似表示数字。这有一个不幸的限制,就是无法表示所有整数,因为很明显,有些整数是素数,或者不能用足够的精度表示为倍数。

按照惯例,具有非常小的小数部分的数字在打印之前会被舍入 - 这就是为什么您看到相当漂亮的输出,但这些值的行为并不像预期的那样。

即使您对整数进行操作,Flash也会在内部将它们转换为浮点数,计算并将结果转换为期望的类型,因此您在Flash中没有正确的整数数学。

你可以在你的情况下做什么:因为starSpawnTime最初是一个整数,如果你这样做,它看起来不会造成任何伤害:

if (!int(startSpawnTime % 10)) { . . . }

if (int(startSpawnTime % 10) == 0) { . . . }

如果你非常关心性能,你可以自己实现整数除法,或者可以使用归纳来计算提醒 - 但我会将此作为练习留给读者:)

顺便说一句:整数在Flash中不可为空,一旦声明,就会为它们分配默认值,整数的默认值为0。因此,写var i:int = 0;是多余的,var i:int就足够了。

答案 1 :(得分:0)

我已尝试过代码(简化)并且可以正常工作

var starSpawnTime:int = 0;
stage.addEventListener(Event.ENTER_FRAME, update);
stop();

function update(e:Event): void {
    starSpawnTime++;

    trace(starSpawnTime);
    trace("Modulus: " + starSpawnTime % 10);

    if ((starSpawnTime % 10) == 0) {
        trace("BAM")
    }
}

可能不是造成问题的模运算符