循环函数向变量添加不准确的值,跟踪代码时数组未定义。怎么修?

Loop function adding inaccurate values to variables, and array is undefined when tracing the code. How to fix?

我在 ACS3 中做了一个弹丸运动模拟,其中一个函数涉及创建一个多维数组,在给定输入角度和速度的情况下绘制时间与球的高度的关系。

当我追踪这些值时,'t' 变量应该有 0.1 的增量,但是,在某些情况下,它会给我近似值(例如,它给了我 0.7999999 而不是 0.8...) .再者,数组的值为'undefined'.

我不知道还有什么可以尝试的,因为如果循环中的变量是 t = t + 0.1;, 则不应显示任何近似值。

我还尝试添加 velocity*Math.sin(angle/(180/Math.PI)) 而不是 vy(y 速度分量)。

shoot.addEventListener(MouseEvent.CLICK, Calculate);

function Calculate(event:MouseEvent):void{

var t = 0;
var position:Array = new Array();

var vy = velocity*Math.sin(angle/(180/Math.PI));
var Time = int(((2*vy)/9.81)*100)/100
    time_txt.text = Time;

while (t <= Time){

    position[t]= (vy*t)-4.905*(t*t);
    t = t + 0.1;
    trace(t);
    trace(position[t]);

}

}

我希望控制台打印正确的时间间隔 (0.1,0.2,0.3...) 以及计算的位置值而不是 'undefined'(基于 SUVAT 方程)。所以预期结果将如下所示:

0.1

(在时间 0.1 计算的位置)

0.2

(在时间 0.2 计算的位置)

0.3

(在时间 0.3 计算的位置)

... 并继续直到变量 't' 大于计算 'Time'.

相反,我得到:

0.1

未定义

0.2

未定义

0.30000000000000004 // 底线是……这是怎么回事?

undefined // 或者这个?

0.4

未定义

0.5

未定义

0.6

未定义

0.7

未定义

0.7999999999999999

未定义

0.8999999999999999

未定义

等...

  • When I traced the values, the 't' variable is supposed to have increments of 0.1, however, in some cases it gives me approximate values (e.g. instead of 0.8, it gives me 0.7999999...).

  • Furthermore, the value of the array is undefined.

这是一个可测试的示例代码,可能有助于解决您的问题。它在做你想做的事吗?

function Calculate(event:MouseEvent):void
{

    var velocity :int = 4; //temp for testing
    var angle :int = 45; //temp for testing
    
    var t :Number = 0;
    var position :Array = new Array();
    var pos_idx :int = 0; //your position within the array
    
    var vy = velocity*Math.sin(angle/(180/Math.PI));
    
    //var Time = int(((2*vy)/9.81)*100)/100
    var Time :Number = 6.5; //temp small value for testing
    
    time_txt.text = Time;
    
    while(t <= Time)
    {
        position[ pos_idx ] = (vy * t) - 4.905 * (t * t);
        trace("position[" + pos_idx + "]: " + position[ pos_idx ] );
        
        t += 0.1;
        t = Number( t.toFixed(3) ); //rounding down the fraction part
        trace("t is: " + t);
        
        pos_idx += 1; //add +1 for next position within array
    }

}

关于您的问题:

(1)
数组位置 "undefined" 问题是因为数组的位置是整数而不是分数。数组的意思是“事物组”(事物 1、事物 2、事物 3 等),例如,如果您的事物是门,那么您可以查看 Door #1Door #2,但如果您尝试编译器将失败查看 Door #0.8.

(2)
在编程语言中,整数是整数(使用 NumberFloatLong 表示分数)。

您的代码 var Time :int = int( ((2*vy)/9.81) * 100) / 100; 的结果可能是 0(例如:当 angle 为 45 时),因为 ((2*vy)/9.81) * 100) / 100; 的结果是0.5766416156465218 但如果您将其转换为 int 那么小数部分现在将被忽略,因此它向下舍入为 0.

的结果

(3)
PS:在长时间运行的 While 循环中使用跟踪时要小心。如果它必须在每个循环中报告 trace,这可能会暂时冻结您的应用程序。 Time越大冻结时间越长