循环函数向变量添加不准确的值,跟踪代码时数组未定义。怎么修?
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 #1
或 Door #2
,但如果您尝试编译器将失败查看 Door #0.8
.
(2)
在编程语言中,整数是整数(使用 Number
或 Float
或 Long
表示分数)。
您的代码 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
越大冻结时间越长
我在 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 of0.8
, it gives me0.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 #1
或 Door #2
,但如果您尝试编译器将失败查看 Door #0.8
.
(2)
在编程语言中,整数是整数(使用 Number
或 Float
或 Long
表示分数)。
您的代码 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
越大冻结时间越长