循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?
Posted
技术标签:
【中文标题】循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?【英文标题】:Loop function adding inaccurate values to variables, and array is undefined when tracing the code. How to fix? 【发布时间】:2020-02-28 12:43:06 【问题描述】:我在 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...) 以及计算出的位置值,而不是“未定义”(基于 SUVAT 方程)。所以预期的结果应该是这样的:
0.1
(在时间 0.1 计算的位置)
0.2
(在时间 0.2 计算的位置)
0.3
(在时间 0.3 计算的位置)
...并继续,直到变量“t”大于计算“时间”。
相反,我得到:
0.1
未定义
0.2
未定义
0.30000000000000004 // 底线是......这是怎么回事?
undefined // 还是这个?
0.4
未定义
0.5
未定义
0.6
未定义
0.7
未定义
0.7999999999999999
未定义
0.8999999999999999
未定义
等等……
【问题讨论】:
Is floating point math broken?的可能重复 你从不定义 角度 所以结果也是未定义的。 【参考方案1】:当我跟踪这些值时,'
t
' 变量应该有 0.1 的增量,但是,在某些情况下,它给了我近似值(例如,它给了我0.8
,而不是0.8
.. .).另外,数组的值为
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
,但如果您尝试查看@987654328,编译器将失败@。
(2)
在编程语言中,整数是整数(使用Number
或Float
或Long
表示分数)。
您的代码var Time :int = int( ((2*vy)/9.81) * 100) / 100;
的结果可能是零(例如:当angle
为45 时)因为((2*vy)/9.81) * 100) / 100;
的结果是0.5766416156465218
但如果您将其转换为int 然后小数部分现在被忽略,因此它向下舍入为0
的结果。
(3)
PS:在长时间运行的While
循环中使用跟踪时要小心。如果您的应用程序必须在每个循环中报告 trace
,这可能会暂时冻结您的应用程序。 Time
越大,冻结时间越长。
【讨论】:
谢谢!它似乎已经解决了这个问题。以上是关于循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?的主要内容,如果未能解决你的问题,请参考以下文章