Показать сообщение отдельно
  #1 (permalink)  
Старый 28.10.2012, 23:40
Новичок на форуме
Отправить личное сообщение для Teol Посмотреть профиль Найти все сообщения от Teol
 
Регистрация: 28.10.2012
Сообщений: 8

Непонятное поведение математики в JS
Здравствуйте,
делал скрипт для изменения прозрачности в JS (учусь),
вот скрипт:

function opacify(x_opacity, y_opacity, time) {
	var steps = 10,
			time = (!time) ? 1000 : time,
			x_opacity = (!x_opacity) ? 1 : x_opacity,
			y_opacity = (!y_opacity) ? 0 : y_opacity,
			anim_step = (y_opacity - x_opacity) / steps,
			counter = 0,
			new_opacity,
			interval_id = setInterval(
				function() {
					x_opacity += anim_step;
					new_opacity = x_opacity.toFixed(1);
                                        console.log('x_opacity = ' + new_opacity);
					document.getElementById('animation').style.opacity = new_opacity;
					counter++
					if (counter >= steps) { clearTimeout(interval_id)}
			}, time / steps);
}


Мне пришлось изрядно помучится, прежде чем я решил проблему, добавив обработку переменной:
x_opacity += anim_step;					
new_opacity = x_opacity.toFixed(1);


Только в этом случае результат уравнения цикла 1 - ((0-1)/10) стал равен:
0.9
0.8
0.7
...
0.0

Если убрать эту обработку(переменную new_opacity) и поставить напрямую:
document.getElementById('animation').style.opacity = x_opacity;

то результат (из логов консоли) цикла такой:
x_opacity = 0.9
x_opacity = 0.8
x_opacity = 0.7000000000000001
x_opacity = 0.6000000000000001
x_opacity = 0.5000000000000001
x_opacity = 0.40000000000000013
x_opacity = 0.30000000000000016
x_opacity = 0.20000000000000015
x_opacity = 0.10000000000000014
x_opacity = 1.3877787807814457e-16

Считается странно, и соответственно в конце прозрачность не убирается в ноль, а остается еле видной.

Я, повторюсь, что проблема, как таковая решена обработкой через доп. переменную, однако меня интересует совет более опытных разработчиков - почему это происходит и почему приходится ее вводить вообще. А в целом буду рад любым добротным советам.

Спасибо!

Последний раз редактировалось Teol, 28.10.2012 в 23:44.
Ответить с цитированием