PDA

Просмотр полной версии : Равенство значений переменных в периодической функции


Evgan
13.08.2010, 11:51
Доброго времени суток.
Столкнулся с такой проблемой: в периодически вызываемой функции (setInterval) происходит изменение значения некого число (увеличение/уменьшение) до определенного значения, однако когда значение изменяемой переменной становится равным определённому, система этого не "отлавливает" +(

Может кто подсказать почему так происходит и как с этим бороть?
Вот этот незамысловатый код:

var A:Number = 0;
var B:Number = 5;
var d:Number = 0.1;
function Periodic():Void {
if (A != B) {
A += d;
} else {
trace('НЕ ПРОИСХОДИТ');
clearInterval(nomInt_Periodic);
}
trace(B+' <> '+A+' <> '+(A == B));
}
var nomInt_Periodic:Number = null;
nomInt_Periodic = setInterval(Periodic, 100);


Благодарю

amesqit
13.08.2010, 12:39
дело в типах данных as, он не предназначен для точных вычислений, подробнее можете почитать например тут (http://www.flasher.ru/forum/showthread.php?t=129480)

rainbowrussia
13.08.2010, 12:50
Замените "A != B" на "Math.abs(A-B) > 0.0000001".
Либо, если задача позволяет, перейдите на целые числа - B=50, d=1.

Ну или как вариант - эмуляция относительно точных вычислений с плавающей точкой:


var A:String = "0";
var B:String = "5";
var d:Number = 0.1;
function Periodic():Void {
if (A != B) {
A = parseFloat(A) + d;
} else {
trace('НЕ ПРОИСХОДИТ');
clearInterval(nomInt_Periodic);
}
trace(B+' <> '+A+' <> '+(A == B));
}
var nomInt_Periodic:Number = null;
nomInt_Periodic = setInterval(Periodic, 10);

Evgan
13.08.2010, 13:02
Благодарю, попробую применить ваши варианты